MYSQL主从和ATLAS读写分离的搭建

73次阅读
没有评论

共计 11649 个字符,预计需要花费 30 分钟才能阅读完成。

本篇内容介绍了“MYSQL 主从和 ATLAS 读写分离的搭建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一、环境准备

操作系统 CENTOS 7.5

数据库 MYSQL5.6.40

ATLAS2.2.1

IP 地址

主库 192.168.56.118

备库 192.168.56.119

ATLAS  中间件 192.168.56.117

我这里只写的是普通的读写分离搭建,没有那些 share 分表之类的那么多复杂的,以后有时间了再搞~_~

MYSQL 主从搭建,这个,其实可以直接去看我写的一篇 MYSQL 主从和主主的文章

http://blog.itpub.net/28371090/viewspace-2154828/

已经很详细了,下面再写一遍,只是想要更简洁一些。

MYSQL5.6.40 下载地址(源码包)

https://downloads.mysql.com/archives/get/file/mysql-5.6.40.tar.gz

ATLAS2.2.1 下载地址

https://github.com/Qihoo360/Atlas/releases/tag/2.2.1

两台服务器一样的安装方式

二、MYSQL 源码安装

使用本地 yum 源

[520]  
name=520  
baseurl=file:///mnt/cdrom  
gpgcheck=0  
enabled=1

1、安装依赖
yum -y install make gcc-c++ cmake bison-devel  ncurses-devel perl
2、创建用户和组  
groupadd mysql
useradd mysql -g mysql -M -s /sbin/nologin 

3、解压 tar -zxvf mysql-5.6.40.tar.gz

cd /opt/

tar -zxvf mysql-5.6.40.tar.gz -C /opt/

cd /opt/mysql-5.6.40

mkdir /data/mysql5.6.40/

4、编译安装
cmake -DCMAKE_INSTALL_PREFIX=/opt/mysql-5.6.40/ -DMYSQL_DATADIR=/data/mysql5.6.40/ -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

5、编译

make make install

6、目录授权
chown mysql.mysql  /data/mysql5.6.40/
mkdir  /data/mysql5.6.40/log
chown mysql.mysql  /data/mysql5.6.40/log
7、数据库初始化
cd  /opt/mysql-5.6.40/
./scripts/mysql_install_db –user=mysql –datadir=/data/mysql5.6.40/
8、配置环境变量
vi /root/.bash_profile 在最后一行添加
PATH=$PATH:$HOME/bin:/data/mysql5.6.40/bin:/data/mysql5.6.40/lib

三、MYSQL5.6.40 主从搭建

1、Master 端配置部署 a、在主服务器上的 my.cnf 配置文件中的 [mysqld] 节点下添加以下配置

vi /etc/my.cnf 

[mysqld] 

server-id=101

default-storage-engine=InnoDB

lower_case_table_names=1

log-bin=/data/mysql5.6.40/log/mysql-bin.log

log-bin-index=/data/mysql5.6.40/log/mysql-bin.index

expire_logs_days=30

datadir=/data/mysql5.6.40/

socket=/tmp/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

[mysqld_safe]

#log-error=/data/mysql5.6.40/mysqld.log

#pid-file=/data/mysql5.6.40/mysqld.pid

这里有遇到启动不了的情况就注释掉

启动数据库  
传统启动方式
/usr/local/mysql/bin/mysqld_safe –user=mysql
制作成服务启动
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
查看启动是否成功
netstat -tnl|grep 3306
ps -ef|grep mysql
相关命令
service mysql start
停止 mysql 服务
service mysql stop
重启 mysql 服务
service mysql restart 
添加到开机启动项
chkconfig –add mysql

b、创建用户,并赋予权限:

登陆数据库时报错
ERROR 2002 (HY000): Can t connect to local MySQL server through socket /tmp/mysqld.sock (2)

ln -s /tmp/mysql.sock  /tmp/mysqld.sock

登陆
mysql -uroot

create user repl_user;

GRANT REPLICATION SLAVE ON *.* TO repl @ % IDENTIFIED BY PASSWORD ******

设置密码时会遇到报错:

ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal number

解决办法:用 select password(你想输入的密码 查询出你的密码对应的字符串

select password(123456

查出的是 *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9

GRANT REPLICATION SLAVE ON *.* TO repl_user @ % IDENTIFIED BY PASSWORD *6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9

2、Slave 端配置部署

vi /etc/my.cnf 

[mysqld] 

server-id=102

default-storage-engine=InnoDB

lower_case_table_names=1

log-bin=/data/mysql5.6.40/log/mysql-bin.log

log-bin-index=/data/mysql5.6.40/log/mysql-bin.index

expire_logs_days=30

datadir=/data/mysql5.6.40/

socket=/tmp/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

[mysqld_safe]

#log-error=/data/mysql5.6.40/mysqld.log

#pid-file=/data/mysql5.6.40/mysqld.pid

3、建立主从同步

由于我这里是新搭建的库,直接创建即可,不需要搞什么备份导入

主库:

登录 mysql

show master status;

记住 file 和 position

mysql show master status;
+——————+———-+————–+——————+——————-+
| File  | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+——————+———-+————–+——————+——————-+
| mysql-bin.000002 |  120 |  |  |  |
+——————+———-+————–+——————+——————-+
1 row in set (0.00 sec)

从库:

登录 mysql

change master to

master_host= 192.168.56.118 ,

master_port=3306,

master_user= repl_user ,

master_password= 123456 ,

master_log_file= mysql-bin.000002 ,

master_log_pos=120;

配置成功后,启动 slave

start slave;

验证主从是否搭建成功在从库执行

show slave status \G;

看到两个 YES 就 OK

 Slave_IO_Running: Yes

Slave_SQL_Running: Yes

在主库创建一个表

use test
create table aa (name char(10));
insert into aa values(Tom
在从库查询
use test
select * from aa;
查到刚刚插入的数据就 O 了

mysql  use mysql;
mysql  desc user;
mysql  GRANT ALL PRIVILEGES ON *.* TO root@ %  IDENTIFIED BY  root  // 授权远程连接
mysql  update user set Password = password(123456) where User= root  // 设置 root 用户密码
mysql  select Host,User,Password from user where User= root
mysql  flush privileges;
mysql  exit

四、报错问题处理:

MYSQL 启动报错

(1)

报错现象:

[root@node1 mysql]# service mysql start

Starting MySQL.. ERROR! The server quit without updating PID file (/var/lib/mysql/node1.pid).

查看报错日志:

[root@node1 mysql]# tail  /var/log/mysqld.log 

190512 19:59:10  InnoDB: Starting an apply batch of log records to the database…

InnoDB: Progress in percents: 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 

InnoDB: Apply batch completed

190512 19:59:10  InnoDB: Waiting for the background threads to start

190512 19:59:11 InnoDB: 5.5.40 started; log sequence number 1595675

190512 19:59:11 [Note] Server hostname (bind-address): 0.0.0.0 port: 3306

190512 19:59:11 [Note]   – 0.0.0.0 resolves to 0.0.0.0

190512 19:59:11 [Note] Server socket created on IP: 0.0.0.0 .

190512 19:59:11 [ERROR] Fatal error: Can t open and lock privilege tables: Table mysql.host doesn t exist

190512 19:59:11 mysqld_safe mysqld from pid file /var/lib/mysql/node1.pid ended

解决方法:

查看配置文件,发现配置文件中 datadir 目录是默认的,需要修改成自己设置的 /usr/local/mysql/data/

[root@node1 mysql]# cat /etc/my.cnf 

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

[root@node1 mysql]# vi /etc/my.cnf 

datadir=/usr/local/mysql/data/

修改完成后重新启动 MYSQL 成功

[root@node1 mysql]# service mysql start

Starting MySQL.. SUCCESS! 

(2)

报错现象:

[root@node1 mysql]# /usr/local/mysql/bin/mysql -uroot

ERROR 2002 (HY000): Can t connect to local MySQL server through socket /tmp/mysql.sock (2)

查看配置文件发现 socket 文件在 /var/lib/mysql/mysql.sock,而不是在 /tmp/mysql.sock

[root@node1 mysql]# cat /etc/my.cnf 

[mysqld]

datadir=/usr/local/mysql/data/

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

解决方法:
设置软链接

ln -s /var/lib/mysql/mysql.sock  /tmp/mysql.sock

或者,修改配置文件

注意一个问题,在生产环境,要注意时区问题

vi /etc/my.cnf

[mysqld]

default-time_zone = +8:00

使用北京时间的时区

注意事项:
mysql 异常宕机情况下,如果未设置 sync_binlog= 1 或者 innodb_flush_log_at_trx_commit= 1 很有可能出现 binlog 或者 relaylog 文件出现损坏,导致主从不一致。

五、ATLAS 读写分离配置

ATLAS2.2.1 下载地址

https://github.com/Qihoo360/Atlas/releases/tag/2.2.1

Atlas-2.2.1.el6.x86_64.rpm

rpm -ivh Atlas-2.2.1.el6.x86_64.rpm

安装完成后,它会默认在”/usr/local/mysql-proxy”目录下生成 4 个文件夹,以及需要配置的文件,如下:

[root@localhost ~]# ll /usr/local/mysql-proxy/
total 4
drwxr-xr-x. 2 root root  75 Jul 30 14:27 bin
drwxr-xr-x. 2 root root  22 Jul 30 16:35 conf
drwxr-xr-x. 3 root root 4096 Jul 30 14:27 lib
drwxr-xr-x. 2 root root  38 Jul 30 16:35 log

bin 目录下放的都是可执行文件

1.“encrypt”是用来生成 MySQL 密码加密的,在配置的时候会用到

2.“mysql-proxy”是 MySQL 自己的读写分离代理

3.“mysql-proxyd”是 360 弄出来的,后面有个“d”,服务的启动、重启、停止。都是用他来执行的

conf 目录下放的是配置文件

1.“test.cnf”只有一个文件,用来配置代理的,可以使用 vim 来编辑

lib 目录下放的是一些包,以及 Atlas 的依赖

log 目录下放的是日志,如报错等错误信息的记录

进入 bin 目录,使用 encrypt 来对数据库的密码进行加密,我的 MySQL 数据的用户名是 buck,密码是 hello,我需要对密码进行加密

[root@localhost bin]# ./encrypt hello
RePBqJ+5gI4=

配置 Atlas,使用 vim 进行编辑

[root@localhost conf]# cd /usr/local/mysql-proxy/conf/
[root@localhost conf]# vim test.cnf

这是用来登录到 Atlas 的管理员的账号与密码,与之对应的是“#Atlas 监听的管理接口 IP 和端口”,也就是说需要设置管理员登录的端口,才能进入管理员界面,默认端口是 2345,也可以指定 IP 登录,指定 IP 后,其他的 IP 无法访问管理员的命令界面。方便测试,我这里没有指定 IP 和端口登录。

# 管理接口的用户名
admin-username = user

# 管理接口的密码
admin-password = pwd

这里的管理接口用户名和密码也用的是默认的

这是用来配置主数据的地址与从数据库的地址,这里配置的主数据库是 118,从数据库是 119

#Atlas 后端连接的 MySQL 主库的 IP 和端口,可设置多项,用逗号分隔
proxy-backend-addresses = 192.168.56.118:3306

#Atlas 后端连接的 MySQL 从库的 IP 和端口,@后面的数字代表权重,用来作负载均衡,若省略则默认为 1,可设置多项,用逗号分隔
proxy-read-

这个是用来配置 MySQL 的账户与密码的,我的 MySQL 的用户是 buck, 密码是 hello, 刚刚使用 Atlas 提供的工具生成了对应的加密密码

# 用户名与其对应的加密过的 MySQL 密码,密码使用 PREFIX/bin 目录下的加密程序 encrypt 加密,下行的 user1 和 user2 为示例,将其替换为你的 MySQL 的用户名和加密密码!pwds = buck:RePBqJ+5gI4=

(RePBqJ+5gI4= 这个就是前面自己加密过的密码,填上去)

这是设置工作接口与管理接口的,如果 ip 设置的”0.0.0.0”就是说任意 IP 都可以访问这个接口,当然也可以指定 IP 和端口,方便测试我这边没有指定,工作接口的用户名密码与 MySQL 的账户对应的,管理员的用户密码与上面配置的管理员的用户密码对应。

#Atlas 监听的工作接口 IP 和端口
proxy-address = 0.0.0.0:1234
#Atlas 监听的管理接口 IP 和端口
admin-address = 0.0.0.0:2345

启动 Atlas

[root@localhost bin]# ./mysql-proxyd test start
OK: MySQL-Proxy of test is started

再 ATLAS 机器上,我是没有安装 MYSQL 的。

/etc/init.d/mysqld status  测试下也没问题,不过对于我来说意义不大,我根本没安装

ps -ef |grep mysql

使用如下命令,进入 Atlas 的管理模式“mysql -h227.0.0.1 -P2345 -uuser -ppwd ”,能进去说明 Atlas 正常运行着呢,因为它会把自己当成一个 MySQL 数据库,所以在不需要数据库环境的情况下,也可以进入到 MySQL 数据库模式。

[root@localhost bin]# mysql -h227.0.0.1 -P2345 -uuser -ppwd
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.99-agent-admin

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type help; or \h for help. Type \c to clear the current input statement.

mysql

可以访问“help”表,来看 MySQL 管理员模式都能做些什么。可以使用 SQL 语句来访问

mysql select * from help;
+—————————-+———————————————————+
| command  | description  |
+—————————-+———————————————————+
| SELECT * FROM help  | shows this help  |
| SELECT * FROM backends  | lists the backends and their state  |
| SET OFFLINE $backend_id  | offline backend server, $backend_id is backend_ndx s id |
| SET ONLINE $backend_id  | online backend server, …  |
| ADD MASTER $backend  | example: add master 127.0.0.1:3306 , …  |
| ADD SLAVE $backend  | example: add slave 127.0.0.1:3306 , …  |
| REMOVE BACKEND $backend_id | example: remove backend 1 , …  |
| SELECT * FROM clients  | lists the clients  |
| ADD CLIENT $client  | example: add client 192.168.1.2 , …  |
| REMOVE CLIENT $client  | example: remove client 192.168.1.2 , …  |
| SELECT * FROM pwds  | lists the pwds  |
| ADD PWD $pwd  | example: add pwd user:raw_password , …  |
| ADD ENPWD $pwd  | example: add enpwd user:encrypted_password , …  |
| REMOVE PWD $pwd  | example: remove pwd user , …  |
| SAVE CONFIG  | save the backends to config file  |
| SELECT VERSION  | display the version of Atlas  |
+—————————-+———————————————————+
16 rows in set (0.00 sec)

mysql

也可以使用工作接口来访问,使用命令“mysql -h227.0.0.1 -P1234 -ubuck -phello”

[root@localhost bin]# mysql -h227.0.0.1 -P1234 -ubuck -phello
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.0.81-log
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type  help;  or  \h  for help. Type  \c  to clear the current input statement.
mysql

如果工作接口可以进入了,就可以在 Windows 平台下,使用 Navicat 来连接数据库,填写对应的 host,Port,用户名,密码就可以

4. 读写分离测试

这里测试读写分离需要使用到 Jmeter 了,它是 Java 写第一套开源的压力测试工具,因为这个比较方便。他有专门测试 MySQL 的模块,需要使用 MySQL 的 JDBC 驱动 jar 包,配置很简单,东西很好很强大很好用。

Jmeter 下载地址:

https://mirrors.tuna.tsinghua.edu.cn/apache//jmeter/binaries/apache-jmeter-5.1.1.zip

MySQL 的 JDBC 包  :

https://cdn.mysql.com//archives/mysql-connector-java-5.1/mysql-connector-java-5.1.44.zip

JAVA8

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

下载后,分别都解压开来,打开 Jmeter (在 bin 目录下有个 jmeter.bat,双击它前,你的机器需要先安装 JAVA8,只有这样才可以运行),在测试计划中,导入 JDBC 的 jar 包

配置 JDBC 的驱动,如下图

名称可以随意填,URL、账密这些按之前设置的来即可,如下图

jdbc:mysql://192.168.56.117:1234/test
hello

配置完成后,进行测试

先创建一个组

添加测试的 JDBC REQUEST

先整一个查询的测试

点击执行之后,去服务器上面的主备库观察数据传输情况

sar -n DEV 1 10000  用这条命令

或者 iostat 也可以

主库:(明显是没有数据传输(几乎没读写))

备库:(明显红色框框看到有数据传输)

由此可见,数据读是从备库读取的。

写入数据也是一样

在主库

create database test;

create table sbtest (name varchar(9));

insert into sbtest values (Tom

insert into sbtest as select * from sbtest;

不停执行以下语句的循环插入

insert into sbtest as select * from sbtest;

有个上百万行,可以开始测试了。

“MYSQL 主从和 ATLAS 读写分离的搭建”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-28发表,共计11649字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)