学习笔记6:mysql多从读负载均衡读写分离

时间:2022-11-21 04:08:25
Mysql主从复制的主要目的:
    分担数据库的读负载

为什么读写分离:
    只能在主库上写
    读在从裤上完成
    
读在多个从服务器上进行,如何分配读操作,所以需要读的负载均衡


读写分离:
    【1.程序实现】
        【优点】:    由开发人员决定在什么库上执行,比较灵活。
                    程序直接连接数据库,所以性能损耗比较小
                    
        【缺点】:    增加工作量,使程序代码更复杂
                    人为控制,比较容易出错误
                    
    【2.使用中间件】
        【mysql-proxy】:可以实现读写分离和从数据库的读负载均衡,不过稳定性较差,不推荐使用
        
        【maxScale】:
        
        【优点】:    根据查询语法的分析,自动完成读写分离(存储过程除外)
                    对程序透明,已有程序不需要做任何更改
        
        【缺点】:    增加了中间层,所以对查询效率有损耗
                    对需要实时性高的查询语句,无法自动在主库执行
                    
读写分离:解决的是如何在复制集群中主从库上,执行不同的sql语句
读负载均衡:具有相同角色的数据库如何分配分担读的请求



【maxSccale】:
    authentication:认证插件
    protocal:协议插件(mysql客户端协议插件|mysql协议端)
    router:路由插件
        【readconnroute】:实现多台从服务器读的负载均衡
        【readwritesplit】:实现读写分离
        
    monitor:监控插件。对数据库的监控
    filter&logging:日志和过滤插件
    
【安装maxSccale】:
    【1.下载安装包】:
            官方下载地址:
                    https://downloads.mariadb.com/MaxScale/
            选择版本:
                    低版本的直接可运行安装
                    https://downloads.mariadb.com/MaxScale/1.4.4/centos/6Server/x86_64/maxscale-1.4.4-1.centos.6.x86_64.rpm
                    
                    -------------------------------------------------------------------------------------------------------------------
                    安装高版本的坑
                    #https://downloads.mariadb.com/MaxScale/2.1.8/rhel/7/x86_64/maxscale-2.1.8-1.rhel.7.x86_64.rpm
                            [root@localhost ~]# rpm -ivh maxscale-2.1.8-1.rhel.7.x86_64.rpm
                            warning: maxscale-2.1.8-1.rhel.7.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 8167ee24: NOKEY
                            error: Failed dependencies:
                                libc.so.6(GLIBC_2.14)(64bit) is needed by maxscale-2.1.8-1.x86_64
                                liblzma.so.5()(64bit) is needed by maxscale-2.1.8-1.x86_64
                                liblzma.so.5(XZ_5.0)(64bit) is needed by maxscale-2.1.8-1.x86_64
                                
                            yum list glibc*
                                    glibc.i686                                                                 2.12-1.209.el6_9.2                                                        @updates
                                    glibc.x86_64                                                               2.12-1.209.el6_9.2                                                        @updates
                                    glibc-common.x86_64                                                        2.12-1.209.el6_9.2                                                        @updates
                                    glibc-devel.x86_64                                                         2.12-1.209.el6_9.2                                                        @updates
                                    glibc-headers.x86_64                                                       2.12-1.209.el6_9.2                                                        @updates
                                    glibc-static.x86_64                                                        2.12-1.209.el6_9.2                                                        @updates
                                    glibc-utils.x86_64                                                         2.12-1.209.el6_9.2                                                        @updates
                                    Available Packages
                                    glibc-devel.i686                                                           2.12-1.209.el6_9.2                                                        updates
                                    glibc-static.i686                                                          2.12-1.209.el6_9.2  
                            发现现有的glicb库都是2.12版本,安装程序需要2.14版本,升级glibc
                            
                            【升级glibc至2.14】:    
                                【1.下载和安装glibc2.14】:
                                    wget http://ftp.gnu.org/gnu/glibc/glibc-2.14.tar.gz
                                    tar -xzvf glibc-2.14.tar.gz
                                    cd glibc-2.14
                                    mkdir build
                                    cd build
                                    ../configure --prefix=/opt/glibc-2.14
                                    make && make install
                                【2.创建软链接】
                                    1、删除原来软链
                                    rm -rf /lib64/libc.so.6 //谨慎操作后不要乱动
                                    
                                【3.解决补救问题】
                                    LD_PRELOAD=/opt/glibc-2.14/lib/libc-2.14.so ln -s /opt/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6
                                    
                                【4.创建新软链接】:
                                    ln -s /opt/glibc-2.14/lib/libc-2.14.so /lib64/libc.so.6
                                
                                【5.查看当前新的glibc版本库】
                                    strings /lib64/libc.so.6 |grep GLIBC_
            -------------------------------------------------------------------------------------------------------------------
    【2.安装支持的软件库】:
            yum install libaio.x86_64 libaio-devel.x86_64 novacom-server.x86_64 -y
                                    
    【3.安装maxSccale】:
            rpm -ivh maxscale-1.4.4-1.centos.6.x86_64.rpm
            warning: maxscale-1.4.4-1.centos.6.x86_64.rpm: Header V4 RSA/SHA1 Signature, key ID 8167ee24: NOKEY
            Preparing...                ########################################### [100%]
               1:maxscale               ########################################### [100%]

                                    
    【4.maxscale命令】:
            maxadmin:
            maxkeys:
            maxscale:
            maxbinlogcheck:
            maxpasswd
            
            
    【5.主数据库上建立监控模块使用账号】:
            select user,host from mysql.user;
            CREATE USER 'scale_mon'@'192.168.164.%' IDENTIFIED BY '112358';
            grant replication slave,replication client on *.* to scale_mon@'192.168.164.%';

    【5.主数据库上建立路由模块使用账号】:需要读取mysql的用户信息,所以需要赋给mysql库的信息
            select user,host from mysql.user;
            CREATE USER 'maxscale'@'192.168.164.%' IDENTIFIED BY '112358';
            grant select on mysql.* to maxscale@'192.168.164.%';

    【7.安装maxscale后在/etc目录下会自动创建配置文件】:
        cd /etc
        vim maxscale.cnf
    【8.编辑配置文件】:
        [maxscale]
        threads=4    #进程数量,8就差不多了,虚拟机环境,给个4就可以
        
        -----------------------------------------
        
        [server1]    #从服务器的配置
        type=server
        address=192.168.164.135
        port=3306
        protocol=MySQLBackend
        
        -----------------------------------------
        
        [server2]    #从服务器的配置
        type=server
        address=192.168.164.136
        port=3306
        protocol=MySQLBackend

        -----------------------------------------
        
        [server3]    #主服务器的配置
        type=server
        address=192.168.164.137
        port=3306
        protocol=MySQLBackend
        
        -----------------------------------------
        
        [MySQL Monitor]    #监控模块
        type=monitor
        module=mysqlmon
        servers=server1,server2,server3    #把所有集群中的服务器都填进来
        user=scale_mon    #监控模块用户名
        passwd=112358    #监控模块用户密码
        monitor_interval=10000        #监控的时间间隔,ms(毫秒)单位

        -----------------------------------------
        
        读写分离模块可以实现读负载,所以这个可以删除,不用配置
        #[read-Only Service]        #只读模块
        #type=service
        #router=readconnroute
        #servers=server1
        #user=maxscale
        #passwd=112358
        #router_options=slave    #是否只在slave集群中执行读的负载均衡,如果想在master上也可以读负载

        -----------------------------------------
        
        [Read-Write Service]    #读写分离模块
        type=service
        router=readwritesplit
        servers=server1,server2,server3    #把所有集群中的服务器都填进来
        user=maxscale                        #读取mysql的用户信息
        passwd=112358
        max_slave_connections=100%            #最大可用从服务器的数量,百分比
        max_slave_replication_lag=60        #当延迟大于多少秒之后,从服务器不参与读写分离的工作中来了,可以把延迟较大的从服务器剔除读负载集群
        
        -----------------------------------------
        
        #[Read-Only Listener]    #没有配置只读服务,所以注释掉
        #type=listener
        #service=Read-Only Service
        #protocol=MySQLClient
        #port=4008

        -----------------------------------------
        
        [Read-Write Listener]    #读写分离监听模块
        type=listener
        service=Read-Write Service
        protocol=MySQLClient
        port=4006                #端口号没有特别需求,改成mysql默认的


    【9.启动测试maxscale】:
        启动:maxscale --config=/etc/maxscale.cnf
              
        查看:    
                ps -ef | grep maxscale
                [root@localhost etc]# ps -ef | grep maxscale
                root      48585      1  0 11:13 ?        00:00:00 maxscale --config=/etc/maxscale.cnf
                root      48615  42123  0 11:15 pts/0    00:00:00 grep --color maxscale
                
                netstat -ntelp
                [root@localhost etc]# netstat -ntelp
                Active Internet connections (only servers)
                Proto Recv-Q Send-Q Local Address               Foreign Address             State       User       Inode      PID/Program name   
                tcp        0      0 0.0.0.0:21                  0.0.0.0:*                   LISTEN      0          12846      3011/pure-ftpd      
                tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      0          11709      1894/sshd           
                tcp        0      0 127.0.0.1:88                0.0.0.0:*                   LISTEN      0          12611      2924/httpd          
                tcp        0      0 192.168.164.136:9989        0.0.0.0:*                   LISTEN      0          256187     33513/mmm_agentd    
                tcp        0      0 0.0.0.0:4006                0.0.0.0:*                   LISTEN      0          387196     48585/maxscale      
                tcp        0      0 0.0.0.0:3306                0.0.0.0:*                   LISTEN      501        262916     34765/mysqld        
                tcp        0      0 0.0.0.0:6603                0.0.0.0:*                   LISTEN      0          387197     48585/maxscale      

        查看管理命令
        默认的用户名密码    
        maxadmin --user=admin --password=mariadb
        
        【list servers】    查看运行服务器信息
        
                [root@localhost etc]# maxadmin --user=admin --password=mariadb
                MaxScale> lister sev
                Command 'lister' not known, type help for a list of available commands
                MaxScale> list servers
                Servers.
                -------------------+-----------------+-------+-------------+--------------------
                Server             | Address         | Port  | Connections | Status              
                -------------------+-----------------+-------+-------------+--------------------
                server1            | 192.168.164.135 |  3306 |           0 | Slave, Running
                server2            | 192.168.164.136 |  3306 |           0 | Slave, Running
                server3            | 192.168.164.137 |  3306 |           0 | Master, Running
                -------------------+-----------------+-------+-------------+--------------------

        【show dbusers "Read-Write Service"】    查看指定模块用户信息
        
                MaxScale> show dbusers "Read-Write Service"
                Users table data
                Hashtable: 0x1a44a30, size 52
                    No. of entries:      13
                    Average chain length:        0.2
                    Longest chain length:        2
                User names: jiankong@%, test123@%, slave_user2@%, zyx123@192.168.164.136, zyx@192.168.164.136, maxscale@192.168.164.%, daili@%, mha@192.168.164.%, scale_mon@192.168.164.%, repl@192.168.164.%, rep@192.168.164.%, mysql.sys@127.0.0.1, slave_user@192.168.164.%