数据读写分离 、 MySQL多实例

**1 数据读写分离
1.1 数据读写分离介绍(什么是数据读写分离?)
把用户访问数据的读(Select)访问和写(insert update delete)访问分别给不同的数据库服务器处理
1.2 为什么要对数据做读写分离存储?
减轻单台服务的并发访问压力和服务器硬件的利用率
1.3 如何实现数据的读写分离存储?
程序实现:程序员编写脚本
搭建服务实现: 使用有读写分离功能的服务软件实现
mysql-proxy maxscale mycat 统称 mysql中间件
1.4 拓扑结构

           1.5  maxscale软件介绍 maxscale-2.1.2-1.rhel.7.x86_64.rpm
            1.6 配置数据读写分离存储结构
	1.6.1  配置MySQL一主一从主从同步结构(51 主  52 从)
	1.6.2  配置读写分离服务器 192.168.4.57
	1.6.1  配置MySQL一主一从主从同步结构(51 主  52 从)
	1.6.2  配置读写分离服务器 192.168.4.57
		1 安装软件maxscale-2.1.2-1.rhel.7.x86_64.rpm

]# yum -y install maxscale-2.1.2-1.rhel.7.x86_64.rpm
2 修改服务的主配置文件(重点)
]# vim /etc/maxscale.cnf
[maxscale] #定义服务启动线程的数量
threads=auto
[server1] #定义第1台数据服务器的ip地址
type=server
address=192.168.4.51
port=3306
protocol=MySQLBackend
[server2] #定义第2台数据服务器的ip地址
type=server
address=192.168.4.52
port=3306
protocol=MySQLBackend
[MySQL Monitor] #指定监视数据库服务器server1 和 server2
type=monitor
module=mysqlmon
servers=server1,server2
user=mysqla #连接server1 和 server2 数据库服务器的用户
passwd=123qqq…A #连接密码
monitor_interval=10000
[Read-Write Service] #定义读写分离服务
type=service
router=readwritesplit
servers=server1,server2 #在主机server1 和 server1 之间做读写分离
user=mysqlb #路由用户
passwd=123qqq…A #密码
max_slave_connections=100%
[MaxAdmin Service] #定义管理管理服务
type=service
router=cli
[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=4016 #端口号
3 配置数据库服务器(51和52)
添加监视用户mysqla
grant replication slave , replication client on . to mysqla@"%" identified by “123qqq…A”;
添加监视用户mysqlb
grant select on mysql.* to mysqlb@"%" identified by “123qqq…A”;
4 启动57 读写分离服务
4.1 测试授权用户
[root@host57 ~]# which mysql || yum -y install mariadb
[root@host57 ~]# mysql -h192.168.4.51 -umysqlb -p123qqq…A
[root@host57 ~]# mysql -h192.168.4.52 -umysqlb -p123qqq…A
[root@host57 ~]# mysql -h192.168.4.51 -umysqla -p123qqq…A
[root@host57 ~]# mysql -h192.168.4.52 -umysqla -p123qqq…A
4.2 启动服务
[root@host57 ~]# maxscale -f /etc/maxscale.cnf
[root@host57 ~]# ls /var/log/maxscale/ 日志文件
maxscale.log
[root@host57 ~]#
5 查看服务状态
[root@host57 ~]# netstat -untlp | grep 4006
tcp6 0 0 :::4006 ::😗 LISTEN 13604/maxscale
[root@host57 ~]# netstat -untlp | grep 4016
tcp6 0 0 :::4016 ::😗 LISTEN 13604/maxscale
[root@host57 ~]#
[root@host57 ~]# kill -9 13604 # 通过杀进程的方式停止服务
访问管理服务查看监控信息
[root@host57 ~]# maxadmin -uadmin -pmariadb -P4016
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
-------------------±----------------±------±------------±-------------------
MaxScale> exit
6 测试配置
连接读写分离服务器的命令格式:
host50]# mysql -h192.168.4.57 -P4006 -u用户 -p密码
6.1 在主数据库服务器添加客户端连接用户
[root@host51 ~]# mysql -uroot -p123qqq…A -e ‘grant select,insert on db3.* to jyaya@"%" identified by “123qqq…A”’
[root@host52 ~]# mysql -uroot -p123qqq…A -e ‘show grants for jyaya@"%"’
6.2 客户端连接服务器57 存储和查询数据
host50]# mysql -h192.168.4.57 -P4006 -ujyaya -p123qqq…A
mysql> insert into db3.user(name,uid) values(“jyaya”,888);
Query OK, 1 row affected (0.03 sec)
mysql> insert into db3.user(name,uid) values(“jyayaA”,888);
Query OK, 1 row affected (0.01 sec)
mysql> insert into db3.user(name,uid) values(“jyayaC”,888);
Query OK, 1 row affected (0.03 sec)
mysql> select name,uid from db3.user where name like ‘jyaya%’;
±-------±-----+
| name | uid |
±-------±-----+
| jyaya | 888 |
| jyayaA | 888 |
| jyayaC | 888 |
±-------±-----+
3 rows in set (0.01 sec)
mysql>
6.3 测试读写分离功能
在从服务器本机向表里添加1条记录,主服务器不会同步写入的数据
host52]# mysql -uroot -p123qqq…A -e ‘insert into db3.user(name) values(“x”)’
host51]#mysql -uroot -p123qqq…A -e ‘select name from db3.user where name=“x”’ 没有名字x的记录
host50]# mysql -h192.168.4.57 -P4006 -ujyaya -p123qqq…A -e ‘select name from db3.user where name=“x”’ 可以查看到名字x 的记录
2 MYSQL多实例
环境准备创建新虚拟机 IP 192.168.4.58 (没安装过mysql服务软件)
软件mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
2.1 MYSQL多实例介绍(什么是MySQL多实例)
在1台物理服务上,运行多个数据库服务
2.2 为什么要使用多实例?
2.3 配置MYSQL多实例,具体步骤如下
1 安装软件
[root@host58 ~]# rpm -q libaio || yum -y install libaio
[root@host58 ~]# grep mysql /etc/passwd || useradd mysql
]# 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
2 环境配置
]# echo KaTeX parse error: Expected 'EOF', got '#' at position 7: PATH ]#̲ vim /etc/bashr…PATH #在文件的末尾添加
:wq
]# source /etc/bashrc
]# which mysql
/usr/local/mysql/bin/mysql
3 创建并编辑主配置文件(重点)
]# rm -rf /etc/my.cnf (如果有的话要删除)

                             ]# vim  /etc/my.cnf
	     [mysqld_multi]#多实例服务的运行配置
      mysqld=/usr/local/mysql/bin/mysqld_safe	 #服务启动调用哪个命令
      mysqladmin=/usr/local/mysql/bin/mysqladmin	 #修改管理员本机密码使用的命令
      user=root  #启动多实例服务的用户是系统的管理员root用户     
	      [mysqld数字]  #定义实例
		datadir=数据库目录
		port=端口
		log-error=错误日志文件
		pid-file=pid号文件
		socket=socket文件(数据库服务自己访问自己的时候建立连接使用的文件)
例子: 在运行2个mysqld服务

]# vim /etc/my.cnf
[mysqld_multi]
mysqld=/usr/local/mysql/bin/mysqld_safe
mysqladmin=/usr/local/mysql/bin/mysqladmin
user=root
[mysqld1]
datadir=/dir1
port=3307
log-error=/dir1/mysqld1.err
pid-file=/dir1/mysqld1.pid
socket=/dir1/mysqld1.sock
[mysqld2]
datadir=/dir2
port=3308
log-error=/dir2/mysqld2.err
pid-file=/dir2/mysqld2.pid
socket=/dir2/mysqld2.sock
:wq
4 启动多实例服务
[root@host58 ~]# setenforce 0
[root@host58 ~]# systemctl stop firewalld
4.1 启动实例1
]# yum -y install perl*
]# mysqld_multi start 1 创建初始文件 和 管理员本机登录密码
[root@host58 ~]# ls /dir1/
auto.cnf ibdata1 ib_logfile1 mysql mysqld1.pid mysqld1.sock.lock sys
ib_buffer_pool ib_logfile0 ibtmp1 mysqld1.err mysqld1.sock performance_schema
[root@host58 ~]#
[root@host58 ~]# netstat -utnlp | grep 3307
tcp6 0 0 :::3307 ::😗 LISTEN 6394/mysqld
[root@host58 ~]#
NW<NMu:n:09d
5 访问多实例服务
5.1 本机连接多实例服务(使用初始密码自己连接自己)
[root@host58 ~]# mysql -uroot -p’NW<NMu:n:09d’ -S /dir1/mysqld1.sock
mysql> alter user root@“localhost” identified by “123456”;
mysql> create database bbsdb;
mysql> show database;
mysql> exit
]# ls /dir1
停止实例服务的命令
[root@host58 ~]# mysqld_multi --user=root --password=123456 stop 1
[root@host58 ~]# netstat -utnlp | grep 3307
[root@host58 ~]# mysqld_multi start 1 启动实例1

			4.1 启动实例2

[root@host58 ~]# ls /dir2
auto.cnf ibdata1 ib_logfile1 mysql mysqld2.pid mysqld2.sock.lock sys
ib_buffer_pool ib_logfile0 ibtmp1 mysqld2.err mysqld2.sock performance_schema
[root@host58 ~]#
[root@host58 ~]# netstat -utnlp | grep 3308
tcp6 0 0 :::3308 ::😗 LISTEN 28180/mysqld
[root@host58 ~]#
[root@host58 ~]# mysql -uroot -p’MWkQsNwb3US’ -S /dir2/mysqld2.sock
mysql> alter user root@“localhost” identified by “123456”;
Query OK, 0 rows affected (0.00 sec)
mysql> create database gamedb;
Query OK, 1 row affected (0.00 sec)
mysql> exit
Bye
[root@host58 ~]# ls /dir2
[root@host58 ~]# netstat -utnlp | grep mysqld
tcp6 0 0 :::3307 :::
LISTEN 25854/mysqld
tcp6 0 0 :::3308 ::😗 LISTEN 28180/mysqld
[root@host58 ~]#
5.2 在客户端连接多实例服务(下节课讲)
需求:允许网络中的所有主机使用admin用户密码123456 连接58主机实例1 且58主机记录用户连接后执行的命令保存的本机的binlog日志
允许网络中的所有主机使用admin2用户密码123456 连接58主机实例2 且58主机记录用户连接后执行的命令保存的本机的binlog日志
具体配置如下:
启用binlog日志
[root@host58 ~]# vim /etc/my.cnf
[mysqld1]

server_id=1
log_bin=mysqld1
[mysqld2]

server_id=2
log_bin=mysqld2
:wq
71 mysqld_multi --user=root --password=123456 stop 1
72 mysqld_multi --user=root --password=123456 stop 2
73 netstat -utnlp | grep mysqld
74 mysqld_multi start 2
75 mysqld_multi start 1
76 netstat -utnlp | grep mysqld
管理员root 登录查看日志信息并添加用户
[root@host58 ~]# mysql -uroot -p123456 -S /dir1/mysqld1.sock
mysql> show master status;
±---------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±---------------±---------±-------------±-----------------±------------------+
| mysqld1.000001 | 154 | | | |
±---------------±---------±-------------±-----------------±------------------+
1 row in set (0.00 sec)
mysql> grant all on webdb.* to admin@"%" identified by “123456”; 添加授权用户
mysql> exit
[root@host58 ~]# mysql -uroot -p123456 -S /dir2/mysqld2.sock
mysql> grant all on gamedb.* to admin2@"%" identified by “123456”;
mysql>
mysql> show master status;
±---------------±---------±-------------±-----------------±------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
±---------------±---------±-------------±-----------------±------------------+
| mysqld2.000001 | 450 | | | |
±---------------±---------±-------------±-----------------±------------------+
1 row in set (0.00 sec)
mysql> exit
客户端连接58主机的实例服务
命令格式: mysql -h192.168.4.58 -u用户名 -p密码 -P端口
[root@host50 ~]# mysql -h192.168.4.58 -uadmin -p123456 -P3307 #连接实例1
[root@host50 ~]# mysql -h192.168.4.58 -uadmin2 -p123456 -P3308 #连接实例2
排错解决办法:
]# yum -y install psmisc
]# killall -9 mysqld (多执行几次)
]# rm -rf /数据库目录名
]# 请认真检查您的/etc/my.cnf
]# mysqld_multi start 编号**

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值