读写分离和多实例

                                            mysql-day07       读写分离和多实例

  

问题配置条件

代理服務器  53  55

主庫52    从库54

案例拓扑

 • 添加一个 MySQL 代理

为客户端提供统一的数据库接口

 读写分离的原理

多台 MySQL 服务器

分别提供读、写服务,均衡流量

通过主从复制保持数据一致性

MySQL 代理面向客户端

收到 SQL 写请求时,交给服务器 A 处理

收到 SQL 读请求时,交给服务器 B 处理

具体区分策略由服务设置        

1)装包

rpm -ivh maxscale-2.1.2-1.rhel.7.x86_64.rpm

[root@host53~]#cd /soft/mysqld/

[root@host53~]#rpm -qa | grep maxscale

maxscale-2.1.2-1.x86_64

[root@host53~]#rpm -qc maxscale                

/etc/maxscale.cnf.template

[root@host53~]#

2)修改配置文件

[root@host53~]#ls /etc/maxscale.cnf

/etc/maxscale.cnf

[root@host53~]#cp /etc/maxscale.cnf  /etc/maxscale.cnf.bak备份默认文件

[root@host53~]#vim /etc/maxscale.cnf   //配置文件maxscale.cnf

2)根据配置文件做相应的设置(2台数据库服务器上添加用户

v //主库52添加,从库54自动同步

监控数据库服务器时,连接数据库服务器的用户            《创建监控用户》

mysql>grant replication slave,replication client on *.* to scalemon@'%'

identified by "123456";

验证访问数据时,连接数据库服务器使用的用户,是否在数据库服务器上存在的,连接用户                                               《创建路由用户》

mysql>grant select on mysql.*to maxscale@'%' identified by  "123456";

创建连接用户,通过这个用户名连接数据库,进行访问  《创建访问数据用户》

mysql> grant all on *.* to student@'%' identified by  "123456";

查看授权用户主库,从库

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

4)验证在代理服务器上授权用户是否可以登入

[root@host53~]#mysql -h192.168.4.52 -uscalemon -p123456

[root@host53~]#mysql -h192.168.4.54 -umaxscale -p123456

5)启动服务

[root@host53~]#maxscale -f  /etc/maxscale.cnf

6)查看服务进程和端口

查看端口

[root@host53~]#netstat -utnlp | grep :4006

[root@host53~]#netstat -utnlp | grep:4018

[root@host53~]#maxadmin  -P4018  -uadmin  -pmariadb

MaxScale>list servers

7)客户端访问数据读写分离服务器

]#which mysql

]#mysql -h192.168.4.53  -p4006 -ustudent -p123456

mysql>select @@hostname;   //这条命令,查看的读取的主机host

mysql>执行插入或查询(在5152本机查看记录)


 配置mysql多实例

mysql多实例的原理

    mysql多实例,简单的说,就是在一台服务器上开启多个不同的mysql服务端口(如    33063307),运行多个mysql服务进程。这些服务进程通过不同的socket监听 不同的服务端口,来提供各自的服务。

这些mysql实例共用一套mysql安装程序,使用不同的my.cnf配置文件、启动程序、 数据文件。在提供服务时,mysql多实例在逻辑上看来是各自独立的,各个实例之间 根据配置文件的设定值,来取得服务器的相关硬件资源。

要求:在主机192.168.4.56配置mysql多实例:

运行2个数据库服务

² 1个数据库服务数据库目录/dataone

服务端口号3307

sock文件/dataone/mysqld.sock

日志文件/dataone/mysqld.log

² 2个数据库服务

数据库目录/datatow

服务端口号3308

sock文件/datatwo/mysqld.sock

日志文件/datatwo/mysqld.log环境准备

Netstat - utnalp | grep:3307

Netstat - utnalp | grep:3308

1)下载软件

[root@redhat~]#wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz

[root@host50~]#tar -xf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz

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

[root@host56~]#echo "export PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile

[root@host56~]#source /etc/profile

[root@host56~]#echo $PATH

/usr/local/mysql/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

2编辑配置文件

]#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

[mysqld1]

port=3307

datadir=/dataone

socket=/dataone/mysqld.sock

log-error=/dataone/mysqld.log

pid-file=/dataone/mysqld.pid

[mysqld2]

port=3308

datadir=/datatwo

socket=/datatwo/mysqld.sock

log-error=/datatwo/mysqld.log

pid-file=/datatwo/mysqld.pid

:wq

3根据配置文件的设置,做相应的配置

3.1创建数据库目录

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

[root@host56~]#mkdir -p /dataone

[root@host56~]#mkdir -p /datatwo

[root@host56~]#useradd mysql

c[root@host56~]#chown mysql:mysql /data*

3.3初始化授权库

]#mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/dataone  --initialize

2018-05-05T08:47:48.992696Z 1[Note]A temporary password is generated for root@localhost:bXk.5j!pjto#

[root@host56~]#ls /dataone/

]#mysqld --user=mysql --basedir=/usr/local/mysql --datadir=/datatwo  --initialize

2018-05-05T08:50:09.429934Z 1[Note]A temporary password is generated for root@localhost:bKsaf+xzk0V3

[root@host56~]#ls /datatwo/

4启动多实例服务

[root@host56~]#mysqld_multi start 1

[root@host56~]#mysqld_multi start 2

[root@host56~]#netstat -utnlp | grep:3308

tcp6 0 0:::3308:::*LISTEN 1156/mysqld

[root@host56~]#netstat -utnlp | grep:3307

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

5访问多实例服务

连接实例服务1

[root@host56~]#mysql -uroot -p'bXk.5j!pjto#' -S  /dataone/mysqld.sock

mysql>ALTER USER user()identified by"123456";

mysql>show databases;

[root@host56~#mysql -uroot -p123456 -S /dataone/mysqld.sock

6连接实例服务2

[root@host56~]#mysql -uroot -p'bKsaf+xzk0V3' -S    /datatwo/mysqld.sock

mysql>alter user user() identified by"123456";

mysql>show databases;

[root@host56~]#mysql -uroot -p123456 -S  /datatwo/mysqld.sock

7)停止启动的实例服务

]#mysqld_multi  --user=root --password=密码  stop 实例编号

[root@host56~]#mysqld_multi --user=root --password=123456 stop 1

[root@host56~]#netstat  -utnlp | grep:3307

[root@host56~]#mysqld_multi --user=root --password=123456 stop 2

[root@host56~]#netstat  -utnlp | grep:3308

[root@host56~]#mysql -uroot -p123456 -S  /datatwo/mysqld.sock

注意:启动不了,启动数据库

*************************************************


总结:

mysql优化

1启用慢查询日志

vim/etc/my.cnf

[mysqld]

slow-query-loglong-query-time=2

log-queries-not-using-indexes 

:wq

]#systemctl restart mysqld

]#mysql-uroot-p123456

mysql>select sleep(3);

mysql>select sleep(5);

查看日志文件内容

]#cat /var/lib/mysql/主机名-slow.log

统计日志文件记录信息

~]#mysqldumpslow /var/lib/mysql/db55-slow.log > /tmp/sql.txt

启用查询日志

vim/etc/my.cnf

[mysqld]

general-log

]#systemctl restart mysqld

]#cat /var/lib/mysql/db55.log

MySQL性能调优

mysql>show variables like"%变量名%";

•提高MySQL系统的性能、响应速度

–替换有问题的硬件(CPU/磁盘/内存等)

–服务程序的运行参数调整

–对SQL查询进行优化

1)查看变量

mysql>show variables like"%time%";

2)设置等待连接时间

mysql>set innodb_lock_wait_timeout=100;

3)查看允许最大并发连接

mysql>show variables like"%max_connections%";

4)更改连接时间

mysql>set global max_connections=300;

5)最大的使用连接

mysql>show global status like"max_used_connections";

6)刷新

mysql>flush status;

7)等待建立连接的超时秒数,默认10,只在登录时有效

mysql>show variables like"%connect_timeout%";

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

mysql>show variables like"%wait_timeout%";

9缓存参数控制单位:字节

•缓冲区、线程数量、开表数量

含义

key_buffer-size用于MyISAM引擎的关键索引缓存大小

sort_buffer_size为每个要排序的线程分配此大小的缓存空间

read_buffer_size为顺序读取表记录保留的缓存大小

thread_cache_size允许保存在缓存中被重用的线程数量

table_open_cache为所有线程缓存的打开的表的数量

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|

+------------------------------+---------+---------------

10查看当前的查询缓存统计

mysql>show global status like"qcache%";

11)所有软件没有独立的日志储存的地方

[root@host52~]#vim /var/log/messages

12记录慢查询

² 选项含义

slow-query-log启用慢查询

slow-query-log-file指定慢查询日志文件

long-query-time超过指定秒数(默认10)的查询才被记录

log-queries-not-using-indexes记录未使用索引的查询

² 调整服务配置

[root@dbsvr1~]#vim /etc/my.cnf

[mysqld]

....

slow_query_log=1

slow_query_log_file=mysql-slow.log

long_query_time=5

log_queries_not_using_indexes=1

[root@dbsvr1~]#service mysql restart

  • 常用日志种类及选项<一般要开启>

² 类型用途配置

错误日志记录启动/运行/停止过程中l og-error[=name]的错误消息

查询日志记录客户端连接和查询操作general-log

general-log-file=

慢查询日志记录耗时较长或不使用索引查询操作slow-query-log

slow-query-log-file=

long-query-time=

[root@host52 mysql]#vim /etc/my.cnf

[mysqld]

general-log//查询日志host52.log

slow-query-log//慢查询日志host52-slow.log

long-query-time=5

log-queries-not-using-indexes

[root@host52 mysql]#systemctl restart mysqld

1)保存到新文件

[root@host52 mysql]#mysqldumpslow host52-slow.log > /tmp/sql.txt

2)动态查询记录文件日志

[root@host52 mysql]#tail -f host52-slow.log

  ###########################################   


办理主库从库快捷设置

    半开同步复制式   /et/my.cnf

       plugin-load= "rpl_semi_sync_master=semisync_master.so;

       rpl_semi_sync_slave=semisync_slave.so"

       rpl-semi-sync-master-enabled = 1

       rpl-semi-sync-slave-enabled = 1

 

主库设置   /et/my.cnf

[mysqld]

#skip-grant-tables

plugin-load = "rpl_semi_sync_master=semisync_master.so;rpl_semi_sync_slave=semisync_slave.so"

rpl-semi-sync-master-enabled = 1

rpl-semi-sync-slave-enabled = 1

server_id=54

log-bin=master54

binlog-format="mixed"

lower_case_table_names = 1

validate_password_policy=0

validate_password_length=6

 

从库   /et/my.cnf

[mysqld]

skip-grant-tables

server_id=56

#validate_password_policy=0

#validate_password_length=6

 

原文地址:https://www.cnblogs.com/qingbai/p/12015255.html