Linux 搭建mysql读写分离

Linux 搭建mysql读写分离:
    1.关闭两台服务器的防火墙:systemctl stop firewalld
    
主从配置:
    主服务器配置
    1.配置my.cnf
        (1).去掉log-bin=mysql-bin前的#    //允许mysql使用binlog,开启主从复制(关键)。
        (2).多个数据库的配置:
            binlog-do-db=数据库名1
            binlog-do-db=数据库名2
            binlog-do-db=数据库名3
            binlog-ignore-db=mysql(忽略mysql自身用的数据库)
        (3).查看server-id  不能重复
        (4).查看expire-log-day   //binlog过期时间,默认为10天。
    2.操作数据库
        (1).创建一个授权的账号:

            create user 'repl'@'%' identified with mysql_native_password by '123456'
            GRANT REPLICATION SLAVE on *.* TO 'repl'@'%'
            
            允许从服务器'10.121.0.220'使用'slave_account'及'123456'这个账号密码对主服务器的所有数据库*.*进行主从复制(REPLICATION SLAVE)
        (2).重启mysql是上述配置生效:service mysql restart
        (3).查看主服务器的binlog状态:show master status
            记下File及Position下的值。以备在配置从服务器时使用。
            注意:File:当前binlog的文件名,每重启一次mysql,就会生成一个新binlog文件
                  Position:当前binlog的指针位置

    从服务器配置
    1.配置my.cnf
        (1)修改server-id=2 (该值不能与主服务器的server-id同)
        (2)添加如下两行:
            relay-log-index=slave-relay-bin.index (中继日志的索引文件)
            relay-log=slave-relay-bin  (中继日志的文件前缀)

        (3)重启mysql使上述配置生效
        (4)登录mysql: mysql -uroot -p你的密码
        (5)停止主从复制服务: stop slave
        (6)主从关联配置
            change master to
            master_host='10.121.0.110', #主服务器IP
            master_user='repl',  #主服务器访问从服务器的用户,即上述第三条第2小条第2子条所述帐号
            master_password='123456', #主服务器访问从的密码,即上述第三条第2小条第2子条所述密码
            master_log_file='mysql-bin.000008',   #主服务器起始的binlog文件名,即图2的file
            master_log_pos=107; #主服务器binlog起始位置,即图2的postion
        (7)启动从服务: start slave
        (8) 查看从服务的状态,判断从服务是否生效: show slave status\G;  (G参数为纵向显示结果)
            如果Slave_IO_Running和Slave_SQL_Running都显示YES,则表示从与主的读写通讯正常、主动复制已经运行,则表明我们主从复制已经设置成功


        四、权限配置 
        虽然某些mysql版本不进行如下操作,可能也能正常运行,但我还是强列建议你设置。否则,必有安全之虑。
        1、为master分配select、insert、update、delete权限
        mysql>GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO '数据库的帐号'@'WEB服务器的IP'  identified by '密码'。
        注意,虽然master只负责写,但也必须有select权限。原因是使用事务时,需要从master查询,二是update/delete这些命令都需要使用select权限。
        
        2、为slave分配select权限 
        mysql> GRANT SELECT ON *.* TO '数据库的帐号'@'WEB服务器的IP'  identified by '密码';
        这样设置也有一个弊端,就是当主宕机时,读写分离机制分主动将写操作转到从上来,这时,就会出现写不正常的情况。所以,slave要分配哪些权限,还看你自己选择。
         
        五、防火墙配置
        刚才我们为了调试方便,先关闭了防火墙,但这样做,非常很不安全。特别是数据库服务器,关系公司的身家性命,更不可小视。
        主从复制的防火墙,还是比较好设置的,如果你只有一台web服务器,则只需要在主、从服务器的iptables里开放2个授权即可。先在主服务器执行如下命令:
        # iptables INPUT -s 10.121.0.220 -j ACCEPT  (允许从服务器访问)
        # iptables INPUT -s 10.121.2.142 -j ACCEPT   (允许web服务器访问)
        # service iptables save (保存上述规则)
        # service iptables restart  (重启iptables)
        在从中将第一条换成主的IP即可。
        设置完后,再在从上用show slave status看看主从复制是否正常。
        
        放行指定端口:
            firewall-cmd --add-port=443/tcp --permanent
            systemctl restart firewalld
            firewall-cmd --query-port=443/tcp
        放行指定IP:
            firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.60.155"  accept"
            systemctl restart firewalld
            firewall-cmd --list-all
        放行指定IP和端口:
            firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.60.155" port protocol="tcp" port="8090" accept"
            systemctl restart firewalld
        
        删除指定规则
            firewall-cmd --permanent --remove-rich-rule="rule family="ipv4" source address="192.168.60.155" port protocol="tcp" port="8090" accept"
            
            
        六、一些故障排除
        设置过程中,可能会出现如下几个故障
        (1) Slave_IO_Running: No
        (2) Slave_IO_Running: Connect
        (3)Last_IO_Error: error connecting to master '[email protected]:3306' - retry-time: 60  retries: 8640
        其实上述故障,都是由IO不正常造成的,请从如下几个步骤着手检查。
        a.配置完主或从的my.cnf后,是否重启了mysql服务。如果重启还不成功,则可以用reboot命令重启服务器后再试
        b.change master那一步所填写的信息是否正确。
        (4)Last_IO_Error: Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).
        如上是说主、从使用了相同的server-id,进入my.cnf检查,改正之,然后重启mysql服务。


1.打开(master)配置文件my.ini,在[mysql]的后面添加如下代码:
    server-id=1 #master的标示
    log-bin=mysql-bin #slave会基于此log-bin来做replication
    binlog-do-db=test #用于master-slave的具体数据库
    binlog_ignore_db=mysql #不用于master-slave的具体数据库
    binlog_ignore_db=information_schema #和binlog-do-db一样,可以设置多个
2.进入(master)的mysql服务,输入以下命令:
    show master status;
3.给从库复制权限
    grant replication slave on *.* to 'slave'@'192.168.1.%' identified by '123456';
4.打开从库1的mysql安装目录,打开配置文件my.ini,在[mysql]的后面添加如下代码:
    server-id=2 #比刚刚主库设定的server-id大就行了,且从库之间不能有一样
    log-bin=mysql-bin #slave会基于此log-bin来做replication
    replicate-do-db=test #用于master-slave的具体数据库
5.保存后启动从库1的mysql服务,进入mysql的命令行,输入如下代码:
    stop slave;
    
    再改变它的master:
        change master to master_host='192.168.1.65', 
        master_port=3306,
        master_user='slave',
        master_password='123456',
        master_log_file='mysql-bin.000040',
        master_log_pos=717;
        
    再启动它的slave:
        start slave;
        
    然后再输入如下代码,检查是否成功:
        show slave status\G;
        
        
        

你可能感兴趣的:(mysql,linux,数据库)