MySQL集群

前提

MySQL版本一致
数据库可以不一致
docker中适用,注意ip

配置

  1. 主库Master
    temer:/] vim /etc/my.cnf
    [mysqld]
       log-bin=mysql-bin    //[主库必须]启用二进制日志
       server-id=222    //[主从必须]集群库唯一ID,默认是1,可以是任意,保证和其他库的不一样
  2. 从库Slave
    temer:/] vim /etc/my.cnf

    [mysqld]
       log-bin=mysql-bin    //[从库非必须]启用二进制日志
       server-id=226    //[主从必须]服务器唯一ID,默认是1,可以是任意,保证和其他库的不一样
       auto_increment_increment=2   //[非必须]步进值auto_imcrement。一般有n台主MySQL就填n
       auto_increment_offset=1  //[非必须]起始值。一般填第n台主MySQL。此时为第一台主MySQL    
       binlog-ignore-db=mysql  //[非必须]忽略mysql库,多个库就重复一行
       binlog-ignore-db=information_schema //[非必须]忽略mysql库,多个库就重复一行
       replicate-do-db=user   //[非必须]要同步的数据库,多个库就重复一行,默认所有库
       replicate-do-db=demo   //[非必须]要同步的数据库,多个库就重复一行,默认所有库

    注:bin-do-db,bin-ignore-db 为互斥关系,只需设置其中一项即可

  3. 重启主从MySQL服务

  4. 在主MySQL上创建可远程访问的账号并授权slave
    • 创建远程访问账号
      mysql> use mysql
      mysql> create user temer identified by 'temer1234';  //temer为用户名,temer1234为密码    
      mysql> grant all on *.* to 'temer'@'%';    //给temer用户授权,%代表所有IP,可替换成具体ip
      mysql> grant select,update,insert,delete on *.* to 'temer'@'%';    //给temer用户增删改查的权限
      mysql> flush privileges;    //刷新权限    
      mysql> quit     //退出并重启

      telnet 192.168.0.1 3306 测试mysql的3306端口是否监听,需访问开放端口

  • 授权slave
    mysql>GRANT REPLICATION SLAVE ON *.* to 'temer'@'%' identified by 'temer1234';  //一般不用root账号, % 代表所有客户端可以连,只要账号密码正确;%也可用具体ip代替
  • 查看master状态
    mysql> show master status;
    +------------------+----------+--------------+------------------+
    | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB |
    +------------------+----------+--------------+------------------+
    | mysql-bin.000004 |      308 |              |                  |
    +------------------+----------+--------------+------------------+

注:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
File和Position是指数据库操作的日志位置

  1. 配置从数据库Slave:

    • 连接主数据库
      mysql> change master to master_host='192.168.145.222',master_user='mysync',master_password='q123456',
       master_log_file='mysql-bin.000004',master_log_pos=308;   //注意不要断开,308数字前后无单引号。
      mysql> start slave;    //启动从服务器复制功能; stop slave 停止
    • 查看slave状态

      mysql> show slave status\G;
      
      *************************** 1. row ***************************
      
            Slave_IO_State: Waiting for master to send event
            Master_Host: 192.168.2.222  //主服务器地址
            Master_User: mysync   //授权帐户名,尽量避免使用root
            Master_Port: 3306    //数据库端口,部分版本没有此行
            Connect_Retry: 60
            Master_Log_File: mysql-bin.000004
            Read_Master_Log_Pos: 600   //#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
            Relay_Log_File: ddte-relay-bin.000003
            Relay_Log_Pos: 251
            Relay_Master_Log_File: mysql-bin.000004
            Slave_IO_Running: Yes    //此状态必须YES
            Slave_SQL_Running: Yes     //此状态必须YES
                  ......

> 注:Slave_IO及Slave_SQL进程必须正常运行,即YES状态,否则都是错误的状态(如:其中一个NO均属错误)     

6. 完成配置。在master新增数据,查看slave变化     

7. 主主复制,一主多从
  同上述一主一从复制    

### 总结遇到的坑    
1. 防火墙    
   作为master的MySQL必须有授权远程访问的账号,需配置账号并在服务器防火墙监听相关端口
2. Slave_IO_Running: contening     
    可能就是防火墙的问题     

3. Slave_SQL_Running: No     
    主从的 ```  File:mysql-bin.000025 ``` \  ``` Position:2463 ``` 不一致, ``` stop slave ``` 重新配置