MySQL主从服务器链式复制配置(ubuntu)

服务器结构:

A、B、C三台服务器; 其中A为新闻数据源,A为B的Master,B为A的Slave,同时也是C的Master;
B服务器从A复制部分数据,C备份A的所有数据;

配置:

  • Master A的配置

sudo vi /etc/mysql/my.cnf

删除以下参数前的注释并修改
server-id       = 1 //分配server-id
log-bin         = master-bin //默认mysql-bin,可以不修改
log-bin-index   = master-bin.index  //非必须
bind-adress     = 0.0.0.0 //默认127.0.0.1 不修改可能导致无法访问

修改系统防火墙使B服务器可以访问3306端口,(详查ufw命令)  
重启mysql:
sudo /init.d/mysql restart

通过语句:
GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TO user@'ip B' IDENTIFIED BY 'password';

给B服务器建立一个可以连接到A的帐号
进入mysql,通过:
show master status;
查看A的状态,记录下file的位置和postion的参数
  • Slave B的配置

sudo vi /etc/mysql/my.cnf

server-id       = 2
log-bin         = slave-bin
bind-address    = 0.0.0.0
relay-log-index =  slave-relay-bin.index //非必须
relay-log       = slave-relay-bin   //非必须

添加参数:
log-slave-updates = 1   
//通常情况,从服务器从主服务器接收到的更新不记入它的二进制日志。
//该选项告诉从服务器将其SQL线程执行的更新记入到从服务器自己的二进制日志。

replicate_wild_do_table = copy_db.copy_table //表示需要复制的库中的表,可以善用%
replicate_wild_ignore_table = ignore_db.ignore_table //不复制的表

至于为什么不使用replicate_do_db和replicate_ignore_db参数,
是为了方式跨库更新时出错,如果能确保不会跨库更新可考虑

重启mysql,进入本机mysql

执行以下语句:
CHANGE MASTER TO MASTER_HOST='server A ip',
MASTER_PORT=3306,
MASTER_USER='user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;

//MASTER_LOG_FILE和MASTER_LOG_POS对应A中的file位置和postion参数,表示开始复制的bin文件和位置

start slave;    //启动Slave
show slave status;  //查看Slave_IO_State参数,如果是Waiting for master to send event,则正常
//正常状态下Slave_IO_Running与Slave_SQL_Running均为yes

//如不能正常链接,根据Slave_IO_State,Slave_IO_Running,Slave_SQL_Running,Last_IO_Error
//等参数查找失败原因

通过:
show master status;
命令记录file位置和postion参数;

给C服务器分配一个帐号用于同步;
方法参照A,防火墙设置参照A;
  • Slave C的配置

sudo vi /etc/mysql/my.cnf
server-id  = 3
relay-log-index =  slave-relay-bin.index //非必须
relay-log       = slave-relay-bin   //非必须

通过CHANGE MASTER TO语句来修改master的参数,参照B的配置;
通过
show slave status;
检查C的状态,参照B

你可能感兴趣的:(mysql,master,slave,主从)