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))