Maxscale读写分离,多实例

一、Mysql读写分离

客户端访问数据的查询请求和写请求分别给不同的数据库服务处理

查询    -->     select                               -->      A数据库数据库 slave               

写        -->     insert update delete         -->     B数据库服务器 master

为什么要数据读写分离?

1)减轻单台数据库服务器的并发访问压力

2)提高硬件的利用率

如何实现数据读写分离?

通过程序实现(让程序员写代码实现)

通过安装软件提供的服务来实现 [中间件] --->mycat ,mysql-proxy ,maxscale

配置数据读写分离?

采用

(Maxscale + mysql一主一从同步):

 

                                                           client    [192.168.4.50]

                                                   中间件  Maxscale  [192.168.4.57]

mysql-server (写)  [192.168.4.51]                                                    msyql-server(读) [192.168.4.52]

                                         master                                                     slave

 

部署maxscale服务

--------------------环境准备[部署一主一从]

 配置[192.168.4.51]主库

1.启用binlog日志

  •  

vim /etc/my.cnf

validate_password_policy=0
validate_password_length=6

log_bin[=master51] #[ ]内可写可不写

server_id=51

2.授权从库用户

  • mysql>grant   replication slave on  *.*  to 用户名@"%"  identified  by "密码";

3.查看binlog日志信息

  • msyql>show master status;
  • +--------------------------+----------+---------------------+----------------------------+-------------------+------------------------+
  • | File                           | Positio| Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |
    +---------------------------+----------+---------------------+---------------------------+-------------------+------------------------+
    | host51-bin.000001 |      759 |                            |                                   |                         |                                | 
    +---------------------------+----------+---------------------+---------------------------+-------------------+------------------------+
     

配置 [192.168.4.52]从库

1.指定server_id

vim /etc/my.cnf
[mysqld]
validate_password_policy=0
validate_password_length=6
server_id=52

2.指定主服务器信息

mysql>change master to master_host="192.168.4.51",master_user="用户名",master_password="密码",master_log_file="参考主库binlog日志信息",master_log_pos=参考主库binlog日志 ;

3.启用slave进程

msyql>statr slave; 

mysql>show slave status\G;

 

--------------------装包配置启服务

[192.168.5.57]#yum -y install      maxscale-2.1.2-1.rhel.7.x86_64.rpm  #该软件需从别的地方拷贝过来

]#rpm -ql    maxscale

]#vim   /etc/maxscale.cnf

[maxscale]
threads=auto                         #auto自动定义线程数量
...
[server1]                                  #定义数据库服务器主机名
type=server
address=192.168.4.51            #master主机ip地址
port=3306
protocol=MySQLBackend
[server2]                                          #新增一个定义数据库
type=server
address=192.168.4.52                 #slave主机ip地址
port=3306
protocol=MySQLBackend           #后端数据库

...

[MySQL Monitor]                          #定义要监视的数据库节点
type=monitor
module=mysqlmon
servers=server1,server2               #监视数据库服务器
user=scalemon                               #用户随意
passwd=123qqq...A                    #密码要符合密码策略
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=scaleroute                      #路由用户
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                                    #定义对读写分离端口号,不需修改i          

...

[MaxAdmin Listener]
 type=listener
 service=MaxAdmin Service
protocol=maxscaled
socket=default
port=4016                                         #新增


                                             

 

      

--------------------用户授权[]

  • [192.168.4.51]根据配置文件的设置在2台数据库服务器上添加对应的用户

mysql>grant  replication slave,  replication   client on *.*   to     scalemon@"%"   identified by "123qqq...A";  #创建监控用户

mysql> grant select on mysql.* to scaleroute@"%" identified by "123qqq...A";                        #路由用户

mysql> select user,host from mysql.user  where user  in ("scalemon","scaleroute");

 

--------------------启动服务

[192.168.4.57]#yum -y install  mariadb          #该机没有SQL命令,需装一个提供命令的软件【mariadb,mysql...】

[192.168.4.57]#mysql  -h192.168.4.51  -uscalemon   -p123qqq...A   #测试用户是否能使用

[192.168.4.57]#mysql  -h192.168.4.51  -uscaleroute   -p123qqq...A

 

[192.168.4.57]#maxscale -f /etc/maxscale.cnf

[192.168.4.57]#netstat -nutlp | grep  maxscale 

tcp6       0      0 :::4016                 :::*                    LISTEN      4948/maxscale       
tcp6       0      0 :::4006                 :::*                    LISTEN      4948/maxscale 

[192.168.4.57]# killall -9  maxscale         #关服务 

 

--------------------测试配置

  • 查看管理信息(在主机57本机自己访问自己)

 

 [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
-------------------+-----------------+-------+-------------+--------------------
 

  • 测试数据读写分离(客户端连接192.168.4.57访问数据)
  • 在主数据库服务器上添加访问数据的用户[192.168.4.51]

mysql>create database db8;

mysql>create table  db8.t1(id int);

mysql>grant select ,insert   on db8.*  to  yaya8@"%"  identified by "123qqq...A";

 

  • 客户端50 , 连接57主机的4006端口

[192.168.4.50]#mysql  -h192.1684.57  -P4006  -uyaya8   -p123qqq...A

mysql> select * from db8.t1;

mysql>inssert into db8.t1 values(50);

 

[192.168.4.52]#mysql  -uroot  -p123qqq...A  -e  "insert into  db8.t1  values(52)"

[192.168.4.52]#mysql  -uroot  -p123qqq...A  -e  "select  * from  db8.t1"

 

[192.168.4.51]#mysql  -uroot   -p密码  -e  "show master   status"

 

二、Msql多实例

  • 1.什么是多实例

在1台服务器上运行多的数据库服务

  • 2.为什么要使用实例

1)节约运维成本

2)提高硬件利用率

  • 3.配置多实例 [192.168.4.50]

1)安装支持多实例服务的软件包    mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz

解压软件,修改目录名 ,调整PATH变量

调整PATH变量[非必须操作选项]

]#vim /etc/profile       --> export  PATH=/usr/local/mysql/bin:$PATH     

]#source  /etc/profile

[root@host50 ~]# mv mysql-5.7.20-linux-glibc2.12-x86_64    /usr/local/mysql

[root@host50 ~]# cd   /usr/local/mysql
 

2)修改服务的主配置文件

[root@host50 ~]#systemctl stop mysqld   

 [root@host50 ~]#systemctl disable mysqld     #把之前的mysql服务停掉,并取消开机自启

]#mv   /etc/my.cnf   /root                                         #把之前的移走,并停服务

配置格式:

  • 数据库目录
  • 端口号            
  • 错误日志(方便排错)     
  • pid号文件
  • socket(虚拟文件,假的,)
  • 例:srwxrwxrwx. 1 mysql mysql        0 5月  14 14:54 mysql.sock   #第一个s表示是sock文件

[192.168.4.50]# 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/mysql3307.log
pid-file=/dir1/mysql3307.pid
socket=/dir1/mysql3307.sock

[mysqld2]
datadir=/dir2
port=3308
log-error=/dir2/mysql3308.log
pid-file=/dir2/mysql3308.pid
socket=/dir2/mysql3308.sock
[192.168.4.50]# mkdir   /dir1    /dir2
 

 

3)启动服务

[192.168.4.50]# /usr/local/mysql/bin/mysqld_multi  start  1      #初始化, 启动编号是1的服务

2019-05-14T08:34:45.136200Z 1 [Note] A temporary password is generated for root@localhost: 2orhEH+QLtG!  密码

]#   /usr/local/mysql/bin/mysql    -uroot     -p'2orhEH+QLtG!'   -S  /dir1/mysql3307.sock           #连接实例

mysql>  alter user  root@"localhost"  identified  by "123456";

mysql>   show databases;          

[192.168.4.50]#netstat  -nutlp  | grep mysqld

tcp6       0      0 :::3307                 :::*                    LISTEN      6554/mysqld  

[192.168.4.50]#killall  -9   mysqld                                                #关服务,不是必要操作

[root@host50 mysql]# ls /dir1
auto.cnf        ibdata1      ib_logfile1  mysql          mysql3307.pid   mysql3307.sock.lock  sys
ib_buffer_pool  ib_logfile0  ibtmp1       mysql3307.log  mysql3307.sock  performance_schema

 

[192.168.4.50]# /usr/local/mysql/bin/mysqld_multi  start  2

2019-05-14T08:45:33.522934Z 1 [Note] A temporary password is generated for root@localhost: MgY,rf0k;>XM
 

 

[192.168.4.50] # /usr/local/mysql/bin/mysql    -uroot     -p'MgY,rf0k;>XM'   -S  /dir2/mysql3308.sock

mysql>   alter  user root@"localhost"  identified   by  "123456";

mysql>  show databases;

mysql>  exit

]#   /usr/local/mysql/bin/mysql    -uroot     -p'123456'   -S  /dir2/mysql3308.sock     #验证新密码

]# netstat   -nutlp   |  grep -i  mysqld  

tcp6       0      0 :::3307                 :::*                    LISTEN      6554/mysqld         
tcp6       0      0 :::3308                 :::*                    LISTEN      6891/mysqld  

 

停止服务

]# /usr/local/mysql/bin/mysqld_multi   --user=root   --password=123456     stop   1

]# /usr/local/mysql/bin/mysqld_multi   --user=root   --password=123456     stop   2

  • 4.验证配置

访问多实例服务,对数据做操作

 

三、Mysql性能调优

软优化(当你了解慢的问题出在哪里):

  • 1.优化数据库服务运行参数
  • 2.让程序员优化访问数据的SQL命令

硬优化(设备优化):

  • 3.升级硬件  (CPU  内存  存储)  

  • 4.网络带宽

  • 5.优化服务架构(网络架构是否有数据传输瓶颈【单点故障】)


 

  1. 优化数据库服务运行参数

mysql>  show variables;

mysql> show variables  like  "%关键字%";        #模糊查找

mysql> show variables like "%timeout%";

mysql> show variables like "connect_timeout";

mysql> show status;

mysql> show  status like "%connect%";

mysql> show status like "Connections"

mysql> set [global] 变量=值;                       #临时修改变量,服务重启就还原了 global全局变量

 

]# vim  /etc/my.cnf                                     #配置永久修改变量

[mysqld]

变量名=值

.....

 

  • 常用设置参数
  •  

max_connections      允许的最大并发连接数

connect_timeout       等待连接超时,默认10s,仅登陆有效

wait_timeout              等待关闭连接的不活动超时秒数,默认28800s(8h)

key_buffer_size        myisam引擎索引大小

 

mysql>show status like "Max_used_connections ";

 

 

公式:最大并发连接/最大并发连接数=  0.85 

 

 

SQL查询优化

  • 2.优化程序员优化访问数据的SQL命令

查询日志:记录在服务器上执行的所有命令

]#vim/ etc/my.cnf

general-log

]#重启

]# talif  /var/lib/mysql

 

 

  • 优化服务查询缓存

数据服务处理查询请求的过程

query_cache_size   默认1M

query_cache_type             ON  查询缓存开启[默认不开]

查看当前的查询缓存统计

 Qcache_hits             0       在缓存你查寻找到一次+1
Qcache_inserts        0      接收到查询请求+1
 

 

 

 

 

你可能感兴趣的:(数据库)