mysql主从复制与读写分离

Linux(Ubuntu)环境MYSQL->Master/Slave主从同步设置以及注意事项 
 
主库(192.168.120) Ubuntu 10.10 Server Mysql version: 5.1.49-1ubuntu8.1-log  备库(192.168.121) Ubuntu 10.10 Server Mysql version: 5.1.49-1ubuntu8.1-log 
由于MySQL不同版本之间的(二进制日志)binlog格式可能会不一样,因此最好的搭配组合是Master的MySQL版本和Slave的版本相同或者更低,Master的版本肯定不能高于Slave版本。 =======================主库(192.168.120)====================================== 1、 修改my.cnf 
 roger@ubuntu:~#vim /etc/my.cnf  禁掉 bind-address此项  [mysqld]  server-id = 1 
 
log-bin=mysql-bin 
 binlog_format=mixed (保持主从库的日志格式一致,如果不一致可能会不成功) 注: 
a、下面两个选项可以制定生成binlog和忽略的库,如果要同步所有数据库则下面两行不要不用写 
b、binlog-ignore-db = mysql 不需要同步的数据库 c、binlog-do-db = rogerdb 需要同步的库 
d、binlog-ignore-db与binlog-do-db正好相反,如果你有100个库,只想同步其中几个,那么你应该使用binlog-do-db,如果不想同步其中的几个,就使用binlog-ignore-db 
e、在实际测试中发现,如果通过上面两个命令指定了库,则master的Position 一直不会变化,google了一下有人说执行sql前要先use rogerdb才行-_-! 2、重启mysql服务  roger@ubuntu:~# /usr/local/mysql/share/mysql/mysql.server restart 3、建立同步用的数据库账户  mysql>GRANT REPLICATION SLAVE ON *.* TO slave@192.168.1.121 IDENTIFIED BY '1q2w3e'; 如果想要在Slave上有权限执行 “LOAD TABLE FROM MASTER” 或 “LOAD DATA FROM MASTER” 语句的话,必须授予全局的 FILE 和 SELECT 权限:  mysql>GRANT RELOAD,SUPER,FILE,SELECT,REPLICATION SLAVE ON *.* TO backup@192.168.1.121 IDENTIFIED BY '1q2w3e'; 4、锁住主库表,停止数据更新  mysql> flush tables with read lock;  不要退出这个终端,否则这个锁就不生效了; 5、显示主库信息并记录  mysql> show master status;   记录前两框的数据 
+—————————–+————-+———————–+—————————+ | File                    | Position | Binlog_Do_DB | Binlog_Ignore_DB | +—————————–+————-+———————–+—————————+ 
| mysql-bin.000016 | 1676483 |                  |                         | +—————————–+————-+———————–+—————————+ 
6、备份需要同步库文件并复制到从库服务器上,如果要同步全部库,则打包/usr/local/msyql/var目录,如果只同步一个数据rogerdb,则只复制rogerdb  roger@ubuntu:~#cd /use/local/mysql/var 
roger@ubuntu:~#tar -zcvf mysql-master-rogerdb.tar.gz rogerdb //将rogerdb数据库打包

 

将文件

mysql-master-rogerdb.tar.gz 

传到

slave

192.168.1.3:/usr/local/mysql/var/ 

 

 

=======================

从库

(192.168.121)====================================== 

1

、登陆从库,解压数据

 

 

roger@ubuntu:~# cd /usr/local/mysql/var 

 

roger@ubuntu:~# tar -zxvf mysql-master-rogerdb.tar.gz 

roger@ubuntu:~# chown -R mysql:mysql rogerdb 

2

、修改

my.cnf 

 

roger@ubuntu:~#vim /etc/my.cnf 

 

禁掉

 

bind-address

此项

 

 

日志的名称

 

 

log-bin=mysql-bin 

 

日志格式

 

 

binlog_format=mixed 

 

从服务器

ID 

 

server-id=2 

 

主服务器的

IP

地址或者域名

 

 

master-host=192.168.1.120 

 

主数据库的端口号

 

 

master-port=3306 

 

同步数据库的用户

 

 

master-user=slave 

 

同步数据库的密码

 

 

master-password=1q2w3e 

 

如果从服务器发现主服务器断掉,重新连接的时间差

 

 

master-connect-retry=60 

 

需要备份的库

 

 

# replicate-do-db=rogerdb 

 

 

忽略的数据库

 

 

replicate-ignore-db=mysql 

 

#replicate-ignore-db=test 

3

、重启

mysql

服务

 

 

roger@ubuntu:~# /usr/local/mysql/share/mysql/mysql.server restart 

4

、手动同步从库

 

 

mysql>slave 

 

stop; 

mysql>CHANGE MASTER TO MASTER_HOST='192.168.1.121', 

 

mysql>CHANGE MASTER TO MASTER_USER='slave', 

 

mysql>CHANGE MASTER TO MASTER_PASSWORD='1q2w3e', 

 

mysql>CHANGE MASTER TO MASTER_PORT=3306, 

 

mysql>CHANGE 

MASTER 

TO 

MASTER_LOG_FILE='mysql-bin.000016',(

刚才在主库记录的数

 

mysql>CHANGE MASTER TO MASTER_LOG_POS=1676483,(

刚才在主库记录的数据

 

mysql>CHANGE MASTER TO MASTER_CONNECT_RETRY=60; 

 

mysql>slave start; 

如果此处CHANGE出错,可以执行 reset slave,来重新设置。 5、检查从库是否正常同步  mysql>show slave status G; 
当Slave_IO_Running 和 Slave_SQL_Running 两列的值都为 “Yes”,表明 Slave 的 I/O 和 SQL 线程都在正常运行,如果出现错误,可以从Last_Error这个参数中看出哪里出错,然后进行排查 
6、查看主库复制进度  mysql>show processlist G; 7、 解锁主库表  mysql>unlock tables; 
8、 分别用如下命令查看master和slave状态  master:  mysql> show master status;     slave:  mysql> show slave status G  
 注意事项:2边都关机重启后,发现SLAVE上报错ERROR 1201 (HY000): Could not initialize master info structure; more error messages can be found in the MySQL error log 解决的办法:在slave上执行 mysql>slave stop; mysql>reset slave; mysql> slave stop;  Query OK, 0 rows affected, 1 warning (0.00 sec)  mysql> change master to master_host='192.168.9.120';  Query OK, 0 rows affected (0.04 sec)  mysql> change master to master_user='slave';  Query OK, 0 rows affected (0.03 sec)  mysql> change master to master_password='1q2w3e';  Query OK, 0 rows affected (0.01 sec)  mysql> change master to master_log_file='mysql-bin.000004';  Query OK, 0 rows affected (0.02 sec)  mysql> change master to master_log_pos=106;  Query OK, 0 rows affected (0.02 sec)  mysql> change master to master_connect_retry=60;  Query OK, 0 rows affected (0.03 sec)  mysql> slave start;  Query OK, 0 rows affected (0.00 sec)  mysql> show slave status G;  发现正常了。  
============================读写分离的实现================================ 
MYSQL读写分离 
主服务器:192.168.1.120 从服务器:192.168.1.121 
MySQL-Proxy调度服务器:192.168.1.120(在同一台机器上,不建议这么做,

最好分离) 
以下操作,均是在192.168.1.120即MySQL-Proxy调度服务器上进行的 
MySQL-Proxy的读写分离主要是通过rw-splitting.lua脚本实现的,因此需要安装lua 
apt-get install lua5.1 
 
6.安装配置MySQL-Proxy 
apt-get install  mysql-proxy mysql-client  
7.配置并使用rw-splitting.lua读写分离脚本 脚本目录是 /usr/share/mysql-proxy 修改读写分离脚本rw-splitting.lua 修改默认连接,进行快速测试,不修改的话要达到连接数为4时才启用读写分离 vim /usr/share/mysql-proxy/rw-splitting.lua -- connection pool 
if not proxy.global.config.rwsplit then proxy.global.config.rwsplit = { 
min_idle_connections = 1, //默认为4 max_idle_connections = 1, //默认为8 is_debug = false } end 
8.修改完成后,启动mysql-proxy(服务管理脚本需要自己修改,哪个服务器读,那个服务器写,是在脚本里定义的) /etc/init.d/mysql-proxy start 附:可以使用的mysql-proxy脚本 #!/bin/bash 
export LUA_PATH=/usr/local/share/mysql-proxy/?.lua mode=$1 
if [ -z "$mode" ]  then   mode="start" fi 
case $mode in 

  'start') 
    mysql-proxy --daemon  
  --proxy-backend-addresses=192.168.9.120:3306  
  --proxy-read-only-backend-addresses=192.168.9.121:3306    --proxy-lua-script=/usr/local/share/mysql-proxy/rw-splitting.lua     ;;   'stop') 
    killall mysql-proxy     ;;   'restart') 
    if $0 stop  then       $0 start     else 
      echo  "retart failed!!!"       exit 1     fi     ;; esac exit 0  
9. 测试读写分离效果 
为了清晰的看到读写分离的效果,需要暂时关闭MySQL主从复制功能 
登陆从数据库服务器192.168.10.121,通过命令行登录管理MySQL服务器 mysql -u root -pylmf  stop slave; 
连接MySQL-Proxy 

mysql -uroot -pylmf -P4040 -h192.168.1.120 
登陆成功后,在rogerdb数据库mytable表中插入两条记录 use rogerdb; 
insert into mytable values (“aaa”,'man); insert into mytable values (“bbb”,”woman'); quit 
分别登陆到主从数据库服务器,对比记录信息,首先,检查主数据库服务器 登录到192.168.1.120主数据库服务器 use rogerdb; 
select * from mytable; 
然后,检查从数据库服务器 
登录到192.168.1.121从数据库服务器 use rogerdb; 
select * from mytable; 没有新记录存在 !!记着 slave start  
 
由此,我们已经实现了MySQL读写分离,目前所有的写操作都全部在Master主服务器上,另外,所有的读操作都分摊给了其它各个Slave从服务器上,用来分担数据库压力。

原文地址:https://www.cnblogs.com/sqbk/p/5888992.html