zoukankan      html  css  js  c++  java
  • 三十五.MySQL读写分离 MySQL多实例 、MySQL性能调优

    1.实现MySQL读写分离
    搭建一主一从结构
    配置maxscale代理服务器
    测试分离配置
     
    1.1 搭建一主一从结构
    192.168.4.51 主
    192.168.4.52 从
    测试OK
     
    1.2 实现mysql读写分离
    1.2.1 配置数据读写分离服务器:192.168.4.50
    ]# yum -y install maxscale-2.1.2-1.rhel.7.x86_64.rpm
    1.2.2 配置maxscale
    ]# vim /etc/maxscale.cnf
    [maxscale]
    threads=auto            //运行的线程的数量
     
    [server1]            //定义数据库服务器
    type=server
    address=192.168.4.51        //数据库服务器的ip
    port=3306
    protocol=MySQLBackend        //后端数据库
     
    [server2]
    type=server
    address=192.168.4.52
    port=3306
    protocol=MySQLBackend
     
    [MySQL Monitor]             //定义监控的数据库服务器
    type=monitor
    module=mysqlmon
    servers=server1, server2    //监控的数据库列表,不能写ip
    user=scalemon               //监视数据库服务器时连接的用户名scalemon
    passwd=123qqq...A           //密码123456
    monitor_interval=10000      //监视的频率 单位为秒
     
    #[Read-Only Service]        //不定义只读服务器
    #type=service
    #router=readconnroute
    #servers=server1
    #user=myuser
    #passwd=mypwd
    #router_options=slave
     
    [Read-Write Service]      //定义读写分离服务
    type=service
    router=readwritesplit
    servers=server1, server2
    user=maxscaled            //用户名 验证连接代理服务时访问数据库服务器的用户是否存在
    passwd=123qqq...A         //密码
    max_slave_connections=100%
     
    [MaxAdmin Service]        //定义管理服务
    type=service
    router=cli
     
    #[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
     
    [MaxAdmin Listener]       //管理服务使用的端口号
    type=listener
    service=MaxAdmin Service
    protocol=maxscaled
    socket=default
    port=4099     //手动添加,不指定时使用的是默认端口在启动服务以后可以知道默认端口是多少
     
    1.2.3 根据配置文件的设置,在数据库服务器上添加授权用户(主库执行,从库查看)
    mysql> grant replication slave,replication client on *.* to scalemon@'%' identified by "123qqq...A";  
    //监控数据库服务器时,连接数据库服务器的用户
    mysql> grant select on mysql.* to maxscaled@"%" identified by "123qqq...A"; 
    //验证 访问数据时,连接数据库服务器使用的用户,是否在数据库服务器上存在的,连接用户
     
    查看授权用户
    在主库上面查看
    mysql> select user,host from mysql.user where user in ("scalemon","maxscaled");
    在从库上面查看
    mysql> select user,host from mysql.user where user in ("scalemon","maxscaled"); 
    +-----------+------+
    | user      | host |
    +-----------+------+
    | maxscaled | %    |
    | scalemon  | %    |
    +-----------+------+
     
    1.2.4 测试授权用户(50)
    ]# mysql -h 192.168.4.51 -u scalemon -p123qqq...A
    ]# mysql -h 192.168.4.52 -u scalemon -p123qqq...A
    ]# mysql -h 192.168.4.51 -u maxscaled -p123qqq...A
    ]# mysql -h 192.168.4.52 -u maxscaled -p123qqq...A
     
    1.2.5 启动服务(50)
    ]# maxscale -f /etc/maxscale.cnf
    ]# ps -C maxscale   //查看进程
    ]#  ps -C  maxscale 
      PID TTY          TIME CMD
    20806 ?        00:00:00 maxscale
    ]# netstat  -antup | grep maxscale
    tcp  0  0 192.168.4.50:60920  192.168.4.52:3306   ESTABLISHED 20806/maxscale      
    tcp  0  0 192.168.4.50:42304  192.168.4.51:3306   ESTABLISHED 20806/maxscale      
    tcp6 0  0 :::4099             :::*                LISTEN      20806/maxscale      
    tcp6 0  0 :::4006             :::*                LISTEN      20806/maxscale      
     
    1.2.5 测试,在本机访问管理端口查看监控状态
    maxadmin -P端口 -u用户名 -p密码
    ]# maxadmin -P4099 -uadmin -pmariadb
    MaxScale> list servers 
    Servers.
    -------------------+-----------------+-------+-------------+--------------------
    Server             | Address         | Port  | Connections | Status              
    -------------------+-----------------+-------+-------------+--------------------
    server1            | 192.168.4.51    |  3306 |           0 | Master, Running
    server2            | 192.168.4.52    |  3306 |           0 | Slave, Running
    -------------------+-----------------+-------+-------------+----------------
     
    1.2.6 在客户端访问读写分离服务器(53)
    51上授权一个可以访问数据的用户
    mysql> GRANT ALL ON *.* TO jim@"%" identified by "123qqq...A";
    从库52查看
    mysql> SELECT user,host FROM mysql.user where user='jim';
    +------+------+
    | user | host |
    +------+------+
    | jim  | %    |
    +------+------+
    53连接读写分离服务器50
    ]# mysql -h192.168.4.50 -P4006 -ujim -p123qqq...A
    mysql> select @@hostname;
    +------------+
    | @@hostname |
    +------------+
    | mysql52    |
    +------------+
    mysql> CREATE DATABASE lisi;
    此时,53从50登录(写入数据),数据直接写入51,同步到52
     
    2.配置MySQL多实例
    直接用50主机
    2.1 清理配置
    ]# systemctl stop mysqld
    ]# mv /etc/my.cnf /root/
    ]# tar -zxvf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
    ]# mv mysql-5.7.20-linux-glibc2.12-x86_64 /usr/local/mysql
    ]# ls /usr/local/mysql
    bin  COPYING  docs  include  lib  man  README  share  support-files
     
    2.1 编写配置文件
    ]# vim /etc/my.cnf
    [mysqld_multi]        //启用多实例
    mysqld = /usr/local/mysql/bin/mysqld_safe       //指定进程文件路径
    mysqladmin = /usr/local/mysql/bin/mysqladmin    //指定管理命令路径
    user = root        //指定进程用户
     
    [mysqld1]        //实例进程名称
    port=3307        //端口号
    datadir=/data3307        //数据库目录 ,要手动创建
    socket=/data3307/mysql1.sock     //指定sock文件的路径和名称
    pid-file=/data3307/mysql1.pid       //进程pid号文件位置
    log-error=/data3307/mysql1.err    //错误日志位置 
     
    [mysqld2]
    port=3308
    datadir=/data3308
    socket=/data3308/mysql2.sock
    pid-file=/data3308/mysql2.pid
    log-error=/data3308/mysql2.err 
     
    2.2 创建数据库目录
    ]# mkdir -p /data3307
    ]# mkdir -p /data3308
     
    2.3 创建进程运行的所有者和组 mysql
    ]# useradd mysql
    ]# chown mysql:mysql /data*
     
    2.4 初始化授权库
    ]# mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/data3307 --initialize
    ...A temporary password is generated for root@localhost: 2Zmil6eiwd:.
     
    ]# mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/data3308 --initialize
    ...A temporary password is generated for root@localhost: ojeidv8Uhj/;
     
    2.5 调整PATH变量
    ]# echo  "export  PATH=/usr/local/mysql/bin:$PATH"  
     >> /etc/profile
    ]# source /etc/profile
    ]# echo $PATH
     
    2.6 启动多实例
    ]# mysqld_multi start 1 //1为实例编号
    ]# mysqld_multi start 2
     
    2.7 查看端口
    ]# netstat -utnlp  | grep :3307
    tcp6    0    0 :::3307       :::*   LISTEN  21717/mysqld        
    ]# netstat -utnlp  | grep :3308
    tcp6    0    0 :::3308       :::*   LISTEN   21911/mysqld        
    ]#  ps -C mysqld
      PID TTY          TIME CMD
    21717 pts/1    00:00:00 mysqld
    21911 pts/1    00:00:00 mysqld
     
    2.8 访问多实例
    使用初始化密码登录多实例1(可以使用了)
    ]# mysql -u root -p'R?N:ou4aBGLt' -S /data3307/mysql1.sock
    mysql> alter user root@"localhost" identified by '123456'; 
     
    使用初始化密码登录多实例2(可以使用了)
    ]# mysql -u root -p'ojeidv8Uhj/;' -S /data3308/mysql2.sock
    mysql> alter user root@"localhost" identified by '123456'; 
     
    3.MySQL性能优化
    练习相关优化选项
    启用慢查询日志
    查看各种系统变量、状态变量
     
    3.1 mysql性能优化
    3.1.1 查看服务运行时的参数配置
    mysql> show variablesG
    509个
    mysql> show variables like "%innodb%";
    134个
     
    3.1.2 并发连接数量
    mysql>  FLUSH STATUS;
    mysql> show global status like "Max_used_connections";
    +----------------------+-------+
    | Variable_name        | Value |
    +----------------------+-------+
    | Max_used_connections | 4     |
    +----------------------+-------+
     
    查看默认的最大连接数
    mysql> show variables like "max_connections%";
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | max_connections | 151   |
    +-----------------+-------+
     
    3.1.3 连接超时时间
    mysql> show variables like "%timeout%"; 
    +------------------------------+----------+
    | Variable_name                | Value    |
    +------------------------------+----------+
    | connect_timeout              | 10       |
    | delayed_insert_timeout       | 300      |
    | have_statement_timeout       | YES      |
    | innodb_flush_log_at_timeout  | 1        |
    | innodb_lock_wait_timeout     | 50       |
    | innodb_rollback_on_timeout   | OFF      |
    | interactive_timeout          | 28800    |
    | lock_wait_timeout            | 31536000 |
    | net_read_timeout             | 30       |
    | net_write_timeout            | 60       |
    | rpl_semi_sync_master_timeout | 10000    |
    | rpl_stop_slave_timeout       | 31536000 |
    | slave_net_timeout            | 60       |
    | wait_timeout                 | 28800    |
    +------------------------------+----------+
     
    3.1.4 允许保存在缓存中被重用的线程数量
    mysql> show variables like "thread_cache_size";
    +-------------------+-------+
    | Variable_name     | Value |
    +-------------------+-------+
    | thread_cache_size | 9     |
    +-------------------+-------+
     
    3.1.5 用于MyISAM引擎的关键索引缓存大小
    mysql> show variables like "key_buffer_size";
    +-----------------+---------+
    | Variable_name   | Value   |
    +-----------------+---------+
    | key_buffer_size | 8388608 |
    +-----------------+---------+
     
    3.1.6 为每个要排序的线程分配此大小的缓存空间
    mysql> show variables like "sort_buffer_size";
    +------------------+--------+
    | Variable_name    | Value  |
    +------------------+--------+
    | sort_buffer_size | 262144 |
    +------------------+--------+
     
    3.1.7 为顺序读取表记录保留的缓存大小
    mysql> show variables like "read_buffer_size";
    +------------------+--------+
    | Variable_name    | Value  |
    +------------------+--------+
    | read_buffer_size | 131072 |
    +------------------+--------+
     
    3.1.8 为所有线程缓存的打开的表的数量
    mysql> show variables like "table_open_cache";
    +------------------+-------+
    | Variable_name    | Value |
    +------------------+-------+
    | table_open_cache | 2000  |
    +------------------+-------+
     
    3.2 SQL查询优化
    启用慢查询日志
    ]# vim /etc/my.cnf
    ...
    slow_query_log=1
    slow_query_log_file=mysql-slow.log
    long_query_time=5
    log_queries_not_using_indexes=1
     
    查看慢查询日志
    ]# mysqldumpslow /var/lib/mysql/mysql-slow.log
    Reading mysql slow query log from /var/lib/mysql/mysql-slow.log
    Count: 1  Time=0.00s (0s)  Lock=0.00s (0s)  Rows=0.0 (0), 0users@0hosts
     
    查看缓存的大小
    mysql> show variables like "query_cache%";
    +------------------------------+---------+
    | Variable_name                | Value   |
    +------------------------------+---------+
    | query_cache_limit            | 1048576 |
    | query_cache_min_res_unit     | 4096    |
    | query_cache_size             | 1048576 |
    | query_cache_type             | OFF     |
    | query_cache_wlock_invalidate | OFF     |
    +------------------------------+---------+
     
    查看当前的查询缓存统计
    mysql> show global status like "qcache%";
    +-------------------------+---------+
    | Variable_name           | Value   |
    +-------------------------+---------+
    | Qcache_free_blocks      | 1       |
    | Qcache_free_memory      | 1031832 |
    | Qcache_hits             | 0       |
    | Qcache_inserts          | 0       |
    | Qcache_lowmem_prunes    | 0       |
    | Qcache_not_cached       | 24      |
    | Qcache_queries_in_cache | 0       |
    | Qcache_total_blocks     | 1       |
    +-------------------------+---------+
  • 相关阅读:
    一日一技:微信开发-自定义菜单
    Redis五种数据结构
    .NET 5 部署在docker上运行
    一日一技:微信开发-发送模板消息
    Redis快速入门及应用
    面试官扎心一问:防止重复请求提交,有什么方案?
    在Windows上安装Docker
    上班摸鱼神器—VSCode 里也可以看股票 & 基金实时数据
    C# Nuget程序集StackExchange.Redis操作Redis 及 Redis 视频资源 及 相关入门指令 牛逼不,全都有
    Mongodb 更新某一条记录 C#
  • 原文地址:https://www.cnblogs.com/luwei0915/p/10491638.html
Copyright © 2011-2022 走看看