mysql的主主复制

    在主主模型中,由于两台服务器都能够进行读写操作,实现了读写不分离,但是对于写操作并没有实现负载均衡的效果,为了避免重复的复制操作,所以每台服务器都需要有自己的server id进行标识。两台Mysql具体如下图

mysq的主主复制+ssl的主从复制_ssl

一、逻辑卷的建立以及Mysql的安装及基本配置详见如下网址的前四步

http://sxhxt.blog.51cto.com/5126000/957712

二、主主配置

1、在两台服务器上各自建立一个具有复制权限的用户

  1. 服务器node1 
  2. mysql>grant replication slave,replication client on *.* to repluser1@'172.16.26.%' identified by'1234'; 
  3. mysql>flush privileges; 
  4. 服务器node2 
  5. mysql>grant replication slave,replication client on *.* to reuser2@'172.16.26.%' identified by'1234'; 
  6. mysql>flush privileges; 

2、修改配置文件:

  1. # 主服务器node1上 
  2. [mysqld] 
  3. server-id = 10 
  4. log-bin = mysql-bin 
  5. auto-increment-increment = 2 
  6. auto-increment-offset = 1 
  7.  
  8. # 主服务器node2上 
  9. [mysqld] 
  10. server-id = 20 
  11. log-bin = mysql-bin 
  12. auto-increment-increment = 2 
  13. auto-increment-offset = 2 

3、如果此时两台服务器均为新建立,且无其它写入操作,各服务器只需记录当前自己二进制日志文件及事件位置,以之作为另外的服务器复制起始位置即可

  1. 在服务器node1上 
  2. mysql> SHOW MASTER STATUS\G 
  3. ************************** 1. row *************************** 
  4.             File: mysql-bin.000003
  5.         Position:353 
  6.     Binlog_Do_DB:  
  7. Binlog_Ignore_DB:  
  8. 1 row in set (0.00 sec) 
  9.  
  10. 在服务器node2上 
  11. mysql> SHOW MASTER STATUS\G 
  12. *************************** 1. row *************************** 
  13.             File: mysql-bin.000004 
  14.         Position: 361 
  15.     Binlog_Do_DB:  
  16. Binlog_Ignore_DB:  
  17. 1 row in set (0.00 sec) 

4、各服务器接下来指定对另一台服务器为自己的主服务器即可:每个master信息用逗号隔开

  1. 在服务器node1上 
  2. mysql>change master to 
  3.          MASTER_HOST = '172.16.200.2'              //主服务的ip地址 
  4.          MASTER_USER = 'reuser'             //主服务器的建立的用户 
  5.          MASTER_PASSWORD = '1234'         //主服务器的用户密码 
  6.          MASTER_LOG_FILE = 'mysql-bin.000004'   //主服务器的日志文件 
  7.          MASTER_LOG_POS = 361    //日志文件的位置 
  8. 在主服务器node2上 
  9. mysql>change master to 
  10.          MASTER_HOST = '172.16.200.1'              //主服务的ip地址 
  11.          MASTER_USER = 'repluser'             //主服务器的建立的用户 
  12.          MASTER_PASSWORD = '1234'         //主服务器的用户密码 
  13.          MASTER_LOG_FILE = 'mysql-bin.000003'   //主服务器的日志文件 
  14.          MASTER_LOG_POS = 353    //日志文件的位置 

5.在两台服务器上分别启动从服务即可具体结果如下图所示

  1. mysql>start slave; 
  2. mysql>show slave status\G 

node1

mysq的主主复制+ssl的主从复制_mysql主从复制_02

node2

mysq的主主复制+ssl的主从复制_mysql_03

6.分别在node1和node2上创建表并添加内容,然后查看另外一台上是否进行了复制同步即可。

mysql基于ssl的主从复制

  由于mysql在复制过程中是明文的,所以就大大降低了安全性,因此需要借助于ssl加密来增加其复制的安全性.

主服务器
node1:172.16.200.1
从服务器
node2:172.16.200.2

在配置ssl前我们先看下一下ssl的状态信息如下图所示

mysq的主主复制+ssl的主从复制_mysql主从复制_04

输出DISABLE表示ssl还未开启,只需在/etc/my.cnf文件中加入ssl即可

  1. #vim /etc/my.cnf 
  2.   [mysqld] 
  3.    ssl 
  4. #service mysqld restart //重启使配置文件生效

mysq的主主复制+ssl的主从复制_mysql主从复制_05

配置主从服务的ssl功能

node1(master)

1、配置CA服务器(这里在node1上配置)

  1. # vim /etc/pki/tls/openssl.cnf 
  2. dir             = /etc/pki/CA   
  3.  
  4. # cd /etc/pki/CA/ 
  5. # mkdir certs newcerts crl 
  6. # touch index.txt 
  7. # echo 01 > serial 
  8.  
  9. # (umask 077;openssl genrsa -out private/cakey.pem 1024) 
  10. # openssl req -x509 -new -key private/cakey.pem -out cacert.pem -days 365 

2、为主服务器node1准备私钥并颁发证书

  1. 创建存放证书的目录    
  2. # mkdir /usr/local/mysql/ssl    
  3. # cd /usr/local/mysql/ssl    
  4. 创建所需要的证书    
  5. # (umask 077;openssl genrsa 1024 > node1.key)    
  6. # openssl req -new -key node1.key -out node1.csr    
  7. # openssl ca -in node1.csr -out node1.crt -days 365   
  8. #cp /etc/pki/CA/cacert.pem /usr/local/mysql/ssl 
  9. #chown -R mysql:mysql /usr/local/mysql/ssl 

3、为slave上的mysql准备私钥及申请证书

  1. 创建存放证书的目录    
  2. # mkdir /usr/local/mysql/ssl    
  3. # cd /usr/local/mysql/ssl    
  4. 创建所需要的证书    
  5. # (umask 077;openssl genrsa 1024 > node2.key)    
  6. # openssl req -new -key node2.key -out node2.csr 
  7. #scp ./node2.csr node1:/root    
  8. 在node1(主服务器)上为 node2(从服务器)签发证书 
  9. #openssl ca -in node2.csr -out node2.crt 
  10. #cd /usr/local/mysql/ssl 
  11. #scp node2.crt /etc/pki/CA/cacert.pem nodes2:/usr/local/mysql/ssl  

到此为止证书已经准备完成,请确保node1和node2上有如下文件,并且属主和属组为mysql

在Master即node1上

  1. [root@mynode1 ~]# ll /usr/local/mysql/ssl 
  2. total 104 
  3. -rw-r--r-- 1 mysql mysql 1103 Aug  9 20:51 cacert.pem 
  4. -rw-r--r-- 1 mysql mysql 3047 Aug  9 20:40 node1.crt 
  5. -rw-r--r-- 1 mysql mysql  639 Aug  9 20:35 node1.csr 
  6. -rw------- 1 mysql mysql  887 Aug  9 20:34 node1.key 

在Slave即node2上

  1. [root@mynode1 ~]# ll /usr/local/mysql/ssl 
  2. total 104 
  3. -rw-r--r-- 1 mysql mysql 1103 Aug  9 20:51 cacert.pem 
  4. -rw-r--r-- 1 mysql mysql 3047 Aug  9 20:40 node2.crt 
  5. -rw-r--r-- 1 mysql mysql  639 Aug  9 20:35 node2.csr 
  6. -rw------- 1 mysql mysql  887 Aug  9 20:34 node2.key 

4、修改配置文件

  1. # vim /etc/my.cnf 
  2. 服务器node1: 
  3. [mysqld]
  4. skip-slave-start=1              //设置重启服务不自动开启线程,需要手动开启 
  5.  
  6. ssl                     //指定ssl,CA信息 
  7. ssl-ca=/usr/local/mysql/ssl/cacert.pem 
  8. ssl-cert=/usr/local/mysql/ssl/node1.crt 
  9. ssl-key=/usr/local/mysql/ssl/node1.key 
  10.  
  11. log-bin=mysql-bin 
  12. relay-log=mysql-relay               //开启中继日志 
  13. auto-increment-increment = 2            //每次ID加2 
  14. auto-increment-offset = 1           //设置起始自动增长 
  15. server-id       = 10 
  16.  
  17. 服务器node2: 
  18. skip-slave-start=1
  19. ssl 
  20. log-bin=mysql-bin 
  21. relay-log=mysql-relay 
  22. server-id       = 20 

5、重启后生效并查看有关ssl的信信息,在node1上进行操作

  1. # service mysqld restart 
  2. mysql> show variables like '%ssl%'; 

mysq的主主复制+ssl的主从复制_mysql主从复制_06

6、在node1上创建具有复制权限的用户并授权给从服务器

  1. mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO repluser@'172.16.200.%' IDENTIFIED BY '1234' REQUIRE SSL; 
  2. mysql> flush privileges; 

7、查看自己的master状态信息并记录

  1. 服务器node1 
  2. mysql>show master status; 
  3. +------------------+----------+--------------+------------------+ 
  4. | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | 
  5. +------------------+----------+--------------+------------------+ 
  6. | mysql-bin.00005 |      107 |              |                  | 
  7. +------------------+----------+--------------+------------------+ 
  8. 1 row in set (0.00 sec 

8、配置slave,在配置之前需要说明一下,如果已经启动slave,并配置过slave信息的,需要先停止slave并删除配置的slave。

  1. 在node2上配置slave: 
  2. mysql> CHANGE MASTER TO MASTER_HOST = '172.16.200.1' ,   
  3.     -> MASTER_USER = 'repluser' ,            
  4.     -> MASTER_PASSWORD = '1234' ,            
  5.     -> MASTER_LOG_FILE = 'mysql-bin.00005' ,         
  6.     -> MASTER_LOG_POS = 107 ,                
  7.     -> MASTER_SSL = 1 , 
  8.     -> MASTER_SSL_CA = '/usr/local/mysql/ssl/cacert.pem' , 
  9.     -> MASTER_SSL_CERT = '/usr/local/mysql/ssl/node2.crt' , 
  10.     -> MASTER_SSL_KEY = '/usr/local/mysql/ssl/node2.key';   

9、配置完成后,启动slave并查看信息如下

  1. mysql>start slave; 
  2. mysql> show slave status\G 
  3. *************************** 1. row *************************** 
  4.                Slave_IO_State: Waiting for master to send event
  5.                   Master_Host: 172.16.200.1 
  6.                   Master_User: repluser 
  7.                   Master_Port: 3306 
  8.                 connect_Retry: 60 
  9.               Master_Log_file: mysql-bin.000005 
  10.           Read_Master_Log_Pos: 107
  11.                Relay_Log_file: relay-bin.000001 
  12.                 Relay_Log_Pos: 4 
  13.         Relay_Master_Log_file: mysql-bin.000005 
  14.              Slave_IO_Running: Yes 
  15.             Slave_SQL_Running: Yes 
  16.               Replicate_Do_DB:  
  17.           Replicate_Ignore_DB:  
  18.            Replicate_Do_Table:  
  19.        Replicate_Ignore_Table:  
  20.       Replicate_Wild_Do_Table:  
  21.   Replicate_Wild_Ignore_Table:  
  22.                    Last_Errno: 0 
  23.                    Last_Error:  
  24.                  Skip_counter: 0 
  25.           Exec_Master_Log_Pos: 608 
  26.               Relay_Log_Space: 403 
  27.               Until_condition: None 
  28.                Until_Log_file:  
  29.                 Until_Log_Pos: 0 
  30.            Master_SSL_Allowed: Yes 
  31.            Master_SSL_cA_file: /usr/local/mysql/ssl/cacert.pem 
  32.            Master_SSL_cA_Path: 
  33.               Master_SSL_cert: /usr/local/mysql/ssl/node2.crt 
  34.             Master_SSL_cipher:  
  35.                Master_SSL_Key: /usr/local/mysql/ssl/node2.key 
  36.         Seconds_Behind_Master: 2132 
  37. Master_SSL_Verify_Server_cert: No 
  38.                 Last_IO_Errno: 0 
  39.                 Last_IO_Error:  
  40.                Last_SQL_Errno: 0 
  41.                Last_SQL_Error:  
  42.   Replicate_Ignore_Server_Ids:  
  43.              Master_Server_Id: 1 

到此为止基于ssl的mysql主从复制已经配置成功

10、测试ssl是否生效

  1. 在从服务器Slave即node2上: 
  2. 使用repluser用户登录mysql 
  3. #mysql --ssl-ca=/usr/local/mysql/ssl/cacert.pem \
  4. --ssl-cert=/usr/local/mysql/ssl/node2.crt  \
  5. --ssl-key=/usr/local/mysql/ssl/node2.key -urepluser -h172.16.200.1 -p1234 \
  6. mysql> \s 
  7. -------------- 
  8. mysql Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i386) using readline 5.1 
  9.  
  10. connection id:        3 
  11. current database:     
  12. current user:        repluser@172.16.200.1 
  13. SSL:            cipher in use is DHE-RSA-AES256-SHA 
  14. current pager:        stdout 
  15. Using outfile:        '' 
  16. Using delimiter:    ; 
  17. Server version:        5.5.19-log MySQL community Server (GPL) 
  18. Protocol version:    10 
  19. connection:        172.16.200.1 via TcP/IP 
  20. Server characterset:    latin1 
  21. Db     characterset:    latin1 
  22. client characterset:    latin1 
  23. conn.  characterset:    latin1 
  24. TcP port:        3306 
  25. Uptime:            8 min 18 sec 
  26.  
  27. Threads: 3 Questions: 20 Slow queries: 0 Opens: 33 Flush tables: 1 Open tables: 26 Queries per second avg
  28.  
  29. 输出信息: 
  30. SSL:            cipher in use is DHE-RSA-AES256-SHA