MySQL读写分离和多实例详解

mysql读写分离的优缺点
数据库读写分离的好处:
– 减轻单台服务器的压力,增加并发量,提高了硬件利用率

数据库读写分离的缺点:
– 单点故障
– 当访问量大时,调度器的性能会成为瓶锦

读写分离环境: 51为主 52为从 57为调度器

1 部署Mysql主从同步结构,一主一从
2 部署192.168.4.57 作为读写分离服务器
2.1 装包
2.2 配置
2.3 根据配置文件设置添加对应的用户
2.4 启动读写分离服务
3 客户端验证读写分离服务的配置

mysql中间件:架设在数据库和客户端之间的软件
mycat : mysql集群,mysql数据分片,mysql对象分离
maxscale
mysql-proxy
这三个软件都可以做mysql数据库读写分离。

一 部署mysql代理服务器(maxscale)
1 安装软件包(中间件)

[root@mycat57 ~]# rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm

2 修改maxscale配置文件

 [root@mycat57 ~]# vim /etc/maxscale.cnf.template 

配置项详解:

 [maxscale]          配置项名
 threads=auto       开启的线程数,根据cpu的核数设置

 18 [server1]        数据库服务器的Ip地址和端口号 
 19 type=server           
 20 address=192.168.4.51             指定master服务器ip 51
 21 port=3306
 22 protocol=MySQLBackend
 
 24 [server2]                         定义数据库服务器
 25 type=server
 26 address=192.168.4.52               指定slave服务器ip  52
 27 port=3306



28 protocol=MySQLBackend

 35 [MySQL Monitor]            监控信息 定义要监视的数据库服务器
 36 type=monitor                 类型为监控
 37 module=mysqlmon         指定模块
 38 servers=server1, server2    具体监视的服务器  
 39 user=scalemon           
 40 passwd=123456
 41 monitor_interval=10000  	#监控心跳为1秒
detect_stale_master=true #即使从全挂掉,保证主担任读写
  用户名和密码是给57连接数据库用的(1监视服务的运行状态,主从结构是否正常 2监视谁是主库,谁是从库)
  
 #52 [Read-Only Service]        只读服务  全部注释
 #53 type=service
 #54 router=readconnroute
 #55 servers=server1
 #56 user=myuser
 #57 passwd=mypwd
 #58 router_options=slave




 63 [Read-Write Service]   定义读写分离服务
 64 type=service
 65 router=readwritesplit  调用的插件功能
 66 servers=server1, server2 读写分离在server1和server2上进行
 67 user=pljsdmin
 68 passwd=123456
 69 max_slave_connections=100%
 配置好后,50访问数据时,把请求给57主机,57上没有数据,也没有用户,
 57接受请求后,根据select 请求,将请求转给52,同时检查客户端访问时候的用户名pljadmin和密码123456在数据库服务器上是否存在,读取自己的配置文件的用户名和用户名密码连上数据库进行检查

 75 [MaxAdmin Service]           管理服务
 76 type=service
 77 router=cli                     调用命令行
 
 #[Read-Only Listener]               没有定义只读,全部注释掉
 #86 type=listener
 #87 service=Read-Only Service

#88 protocol=MySQLClient
 #89 port=4008

 91 [Read-Write Listener]         定义读写分离服务使用的端口号
 92 type=listener                      
 93 service=Read-Write Service
 94 protocol=MySQLClient
 95 port=4006                             指定端口号
 
  97 [MaxAdmin Listener]          指定管理服务使用的端口号
 98 type=listener
 99 service=MaxAdmin Service
100 protocol=maxscaled
101 socket=default
102 port=4026                

二 主服务器mysql51授权
1 用于客户端登录的授权

grant replication slave,replication client on *.* to scalemon@"%" identified by "123456";

2 用于读写分离调度器验证客户端登录信息连接数据库的授权

 grant select on mysql.* to pljadmin@"%" identified by "123456";

3 从数据库服务器mysql52查看具体授权信息,发现授权信息已经同步

 mysql> select user,host from mysql.user;
+-----------+-------------+
| user      | host        |
+-----------+-------------+
| lily      | %           |
| pljadmin  | %           |
| repluser  | %           |
| scalemon  | %           |
| root      | 192.168.4.% |
| mysql.sys | localhost   |
| root      | localhost   |

mysql> show grants for scalemon@"%";
+----------------------------------------------------------------------+
| Grants for scalemon@%                                                |
+----------------------------------------------------------------------+
| GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'scalemon'@'%' |
+----------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show grants for pljadmin@"%";
+---------------------------------------------+
| Grants for pljadmin@%                       |
+---------------------------------------------+
| GRANT USAGE ON *.* TO 'pljadmin'@'%'        |
| GRANT SELECT ON `mysql`.* TO 'pljadmin'@'%' |
+---------------------------------------------+
2 rows in set (0.00 sec)

三 调度器mycat57启动maxscale 服务

[root@mycat57 ~]# vim /etc/maxscale.cnf
[root@mycat57 ~]# systemctl restart maxscale.service 
[root@mycat57 ~]# ss -antulp | grep maxscale
tcp    LISTEN     0      128      :::4026                 :::*                   users:(("maxscale",pid=30747,fd=12))
tcp    LISTEN     0      128      :::4006                 :::*                   users:(("maxscale",pid=30747,fd=11))

四:验证

[root@mycat57 ~]# maxadmin -uadmin -pmariadb -P4026
MaxScale> list 
Unknown or missing option for the list command. Valid sub-commands are:
    clients    List all clients
    dcbs       List all DCBs
    filters    List all filters
    listeners  List all listeners
    modules    List all currently loaded modules
    monitors   List all monitors
    services   List all the services
    servers    List all servers
    sessions   List all sessions
    threads    List polling threads
    commands   List registered commands
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
-------------------+-----------------+-------+-------------+-------------------

五,客户端访问192.168.4.50

[ root@mysql50 aa]# mysql -h192.168.4.57 -P4006 -uyaya100 -p123456
 mysql> insert into a values(888);
Query OK, 1 row affected (0.08 sec)

mysql> select * from a;
+------+
| id   |
+------+
|  888 |
+------+

51  mysql> select * from db1.a;
+------+
| id   |
+------+
|  888 |

+------+
1 row in set (0.00 sec)

52 mysql> select * from a;
+------+
| id   |
+------+
|  888 |
+------+
1 row in set (0.00 sec)

写入数据同步,那么如何确定读取数据时在从服务器52上读取的呢
在52上写入数据,如果在51上查询不到这个新数据,而在50上查不到,说明读写分离功能实现。

  mysql> insert into a values (999);
  mysql> select * from a;
+------+
| id   |
+------+
|  888 |
|  999 |
+------+
2 rows in set (0.00 sec)

51 查询不到新数据

mysql> select * from db1.a;
+------+
| id   |
+------+
|  888 |
+------+
1 row in set (0.00 sec)

50上可以查询到新数据

mysql> select * from a;
+------+
| id   |
+------+
|  888 |
|  999 |
+------+
2 rows in set (0.01 sec)

××××××××××××××××××××××××××××××××××××××××××

多实例概述
什么是多实例:在一台物理机上运行多个数据库服务程序
为什么要使用多实例: 节约运维成本,提高硬件利用率
缺点:单点故障,一台服务器挂了,就全挂了
访问时通过mysql.sock文件来传递数据

每个实例必须要有自己的数据库目录和socket套接字文件以及端口号,错误日志log-error,pid文件 pid-file

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

5.7.17版本的Mysql不带多实例的功能。
停止mysqld服务
1 重新装包:mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz

[root@mysql50 ~]# mkdir bb
[root@mysql50 ~]# tar -xf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz -C bb
[root@mysql50 ~]# cd bb/mysql-5.7.20-linux-glibc2.12-x86_64/

将整个数据库目录移动到/usr/local下改名为mysql

[root@mysql50 ~]# mv bb/mysql-5.7.20-linux-glibc2.12-x86_64/ /usr/local/mysq
[root@mysql50 ~]# vim /etc/profilel
#/etc/profile
PATH=/usr/local/mysql/bin:$PATH
[root@mysql50 ~]# source /etc/profile

2 修改配置文件
每个实例要有独立的数据库目录、监听端口号、实例名称和独立的sock文件

[root@mysql50 mysql]# vim /etc/my.cnf
[mysqld_multi]         //启用多实例
mysqld = /usr/local/mysql/bin/mysqld_safe   // 指定进程文件路径
mysqladmin = /usr/local/mysql/bin/mysqladmin  //指定管理命令路径
user = root               //指定进程用户
 
[mysql1i]                   //实例进程名称
port = 3307              //端口号
datadir = /data3307              //数据库目录,要手动创建
socket = /data3307/mysql3307.sock       //指定sock文件的路径和名称
pid-file = /data3307/mysql3307.pid         //进程Pid号文件位置
log-error = /data3307/mysql3307.log      //错误日志文件

[mysqld2]
port = 3308
datadir = /data3308
socket = /data3308/mysql3308.sock
pid-file = /data3308/mysql3308.pid
log-error = /data3308/mysql3308.log

3 创建数据库目录

[root@mysql50 mysql]# mkdir /data3307
[root@mysql50 mysql]# mkdir /data3308

4 创建进程运行的所有者和组 mysql

[root@mysql50 mysql]# useradd mysql
[root@mysql50 mysql]# chown  mysql:mysql  /data*
[root@mysql50 mysql]# ls -ld /data3307
drwxr-xr-x. 2 mysql mysql 6 11月 24 17:01 /data3307
[root@mysql50 mysql]# ls -ld /data3308
drwxr-xr-x. 2 mysql mysql 6 11月 24 17:02 /data3308

5 初始化授权库

[root@mysql50 mysql]# mysql --user=mysql --basedir=/usr/local/mysql --datadir=/data3307 --initialize     
(此步骤可以省略,在启动实例进程时会自动创建)
初始化
[root@mysql50 mysql]# mysqld_multi start 1
2018-11-24T09:16:37.396125Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2018-11-24T09:16:37.397881Z 1 [Note] A temporary password is generated for root@localhost: z>qlsf_Nh6K+
[root@mysql50 mysql]# mysqld_multi start 2
2018-11-24T09:17:54.081693Z 0 [Warning] Gtid table is not ready to be used. Table 'mysql.gtid_executed' cannot be opened.
2018-11-24T09:17:54.083617Z 1 [Note] A temporary password is generated for root@localhost: 7NUdtqrK6y-_

6 连接数据库3307

[root@mysql50 mysql]# mysql -uroot -p'z>qlsf_Nh6K+' -S /data3307/mysql3307.sock
修改密码
mysql> alter user root@localhost identified by "123456";
查看数据库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
mysql> create database db3307;
mysql> create table db3307.b(id int);
mysql> insert into db3307.b values(3307);

7 连接数据库3308

[root@mysql50 mysql]# mysql -uroot -p'7NUdtqrK6y-_' -S /data3308/mysql3308.sock
mysql> alter user root@localhost identified by "123456";
mysql> create database db3308;
mysql> create table db3308.a(id int);
mysql> insert into db3308.a values(888);

8 查看服务端口

[root@mysql50 mysql]# ss -antulp | grep mysqld
tcp    LISTEN     0      80       :::3307                 :::*                   users:(("mysqld",pid=32510,fd=16))
tcp    LISTEN     0      80       :::3308                 :::*                   users:(("mysqld",pid=32706,fd=16))

9 关闭3307的端口

[root@mysql50 mysql]# mysqld_multi --user=root --password=123456 stop 1
[root@mysql50 mysql]# ss -antulp | grep mysqld
tcp    LISTEN     0      80       :::3308                 :::*                   users:(("mysqld",pid=32706,fd=16))

猜你喜欢

转载自blog.csdn.net/weixin_42104231/article/details/84611282
今日推荐