Atlas中间件快速入门(实现数据库读写分离)

news2024/12/23 12:27:44

一、Atlas简介

1
2
3
4
1. Atlas是由 Qihoo 360公司Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目
2. 它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性
3. 目前该项目在360公司内部得到了广泛应用,很多MySQL业务已经接入了Atlas平台,每天承载的读写请求数达几十亿条
4. 有超过50家公司在生产环境中部署了Atlas,超过800人已加入了我们的开发者交流群,并且这些数字还在不断增加

主要功能

  • 1.读写分离
  • 2.从库负载均衡
  • 3.IP过滤
  • 4.自动分表
  • 5.DBA可平滑上下线DB
  • 6.自动摘除宕机的DB

二、MySQL主从系统搭建

设计图

 

介绍

1
由图可以看出要想使用Atlas首先我们需要搭建一个MySQL的集群,Atlas作为数据库中间件,可以帮助我们进行请求路由,负载均衡等

MySQL主从复制搭建

  • MySQL服务器版本选择
    1
    2
    3
    
    Atlas官网安装的注意事项中提到MySQL应该选择的版本(建议大于5.1版本,最好使用5.6版本)
    
    我这里使用5.6版本进行演示.
    
  • 搭建步骤
    • 注意事项
      1
      2
      3
      
      我这里搭建MySQL集群使用docker容器进行搭建
      1. 没有那么多硬件资源
      2. 搭建方便
      
    • 搭建步骤
  1. 本机要安装docker
  1. 拉取MySQL5.6版本的镜像
1
2
3
4
5
1. 进入duckerhub网站
   https://hub.docker.com/
2. 搜索mysql
3. 查看mysql版本,并且5.6版本的mysql拉取到本地
   拉取命令 docker pull mysql:5.6.51
  1. 开始进行安装
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
1. 首先在docker平台上启动两个MySQL服务,一个作为主,一个作为从
2. 启动MySQL
   主(名字叫mysql-master)
      --> docker run -p3307:3306 --name mysql-master --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.51
   从(名字叫mysql-slave)
      --> docker run -p3308:3306 --name mysql-slave --privileged=true -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.51
3. 启动完成之后,使用docker ps命令查看当前运行的mysql容器

[root@localhost ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS                    NAMES
329f0925de00   mysql:5.6.51   "docker-entrypoint.s…"   9 seconds ago    Up 7 seconds    0.0.0.0:3308->3306/tcp   mysql-slave
b6e89b46286f   mysql:5.6.51   "docker-entrypoint.s…"   17 seconds ago   Up 16 seconds   0.0.0.0:3307->3306/tcp   mysql-master

4. 设置mysql-master为主,设置mysql-slave为从

   4.1 使用docker命令进入mysql-master容器内部
       
       docker exec -it b6e89b46286f bash
       进入容器之后因为容器内部没有安装vim编辑器,所以首先安装vim编辑器
       在安装vim之前首先更新一个apt库 所以先执行更新库命令  apt-get update
       更新库完成之后在执行安装vim编辑器命令 apt-get install -y vim
       如果不先更新apt库,那么vim可能不会安装成功
       
       使用vim编辑器打开mysql的配置文件my.cnf  vim /etc/mysql/my.cnf
       在my.cnf配置文件中首先就是设置server-id=100 设置一个任意整数即可,是MySQL集群进行编号.
       在my.cnf中开启log-bin日志(很重要,MySQL集群,数据同步的关键) log-bin=mysql-bin
       
       配置如下:
       
       [mysqld]
       # MySQL集群编号,不能重复
       server-id=100 
       # 开启二进制日志功能,日志名字随便取
       log-bin=mysql-bin
       
       在当前的MySQL主服务器中创建用户,从服务器可以用新创建的用户进行数据同步(也可以直接使用root用户)
       我这里不重新创建用户了,直接使用root用户进行数据同步,但是需要将root用户设置成可以进行数据同步
       GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'root'@'%';
       刷新权限  FLUSH PRIVILEGES;
       
       到此为止,主服务器配置完成(配置完成之后最好是重启mysql服务器)
       
       查看主服务器的状态在MySQL的交互界面输入 show master status;
       
       mysql> show master status;
       +------------------+----------+--------------+------------------+-------------------+
       | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
       +------------------+----------+--------------+------------------+-------------------+
       | mysql-bin.000001 |      360 |              |                  |                   |
       +------------------+----------+--------------+------------------+-------------------+
       1 row in set (0.00 sec)
       
   4.2 使用docker命令进入mysql-slave容器内部

       docker exec -it 329f0925de00 bash
       
       他的内部也没有vim所以和主节点安装方式一样,安装vim编辑器
       使用vim编辑器打开mysql-slave的配置文件my.cnf  vim /etc/mysql/my.cnf
       
       配置如下:
       
       [mysqld]
       # MySQL集群编号,不能重复
       server-id=101
       # 中继日志
       relay_log=edu-mysql-relay-bin

       配置完从容器之后,重启从容器,然后计入到容器中,使用myql -uroot -p登陆客户端
       
    4.3 两台容器都配置完成,接下来开始将两个容器关联起来.
        
       4.3.1 分别进入两个容器中使用mysql -uroot -p 登陆进mysql交互环境
       4.3.2 在主服务器中使用命令查看当前master服务器状态 show master status; 记录下File和Position设置从服务器时需要用到这两个数据
       4.3.3 在从服务器中使用命令关联主服务器,这时需要知道主服务器的IP地址可以使用docker命令查询主服务器的IP地址
       查询IP地址 docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql-master  (这条命令是docker命令不能在MySQL交互环境执行,需要在容器外面执行)
       
       4.3.4 执行了主服务器的IP地址之后在从服务器的MySQL交互页面开始关联主服务器
       
       change master to master_host='172.17.0.2', \
       master_user='root',\
       master_password='123456', \
       master_port=3306, \
       master_log_file='mysql-bin.000001', \
       master_log_pos= 360, \
       master_connect_retry=30;
       
       配置说明:

       master_host:Master的地址
       master_port:Master的端口号,指的是容器的端口号
       master_user:用于数据同步的用户
       master_password:用于同步的用户的密码
       master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
       master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
       master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
       4.3.5 开启slave    start slave;
       4.3.6 在从服务器中查看主从同步状态  show slave status \G;
       
       mysql> show slave status \G;
        *************************** 1. row ***************************
                       Slave_IO_State: Waiting for master to send event
                          Master_Host: 172.17.0.2
                          Master_User: root
                          Master_Port: 3306
                        Connect_Retry: 30
                      Master_Log_File: mysql-bin.000001
                  Read_Master_Log_Pos: 360
                       Relay_Log_File: edu-mysql-relay-bin.000002
                        Relay_Log_Pos: 283
                Relay_Master_Log_File: mysql-bin.000001
                     Slave_IO_Running: Yes    # YES为成功
                    Slave_SQL_Running: Yes    # YES为成功
                      Replicate_Do_DB:
                  Replicate_Ignore_DB:
                   Replicate_Do_Table:
               Replicate_Ignore_Table:
              Replicate_Wild_Do_Table:
          Replicate_Wild_Ignore_Table:
                           Last_Errno: 0
                           Last_Error:
                         Skip_Counter: 0
                  Exec_Master_Log_Pos: 360
                      Relay_Log_Space: 460
                      Until_Condition: None
                       Until_Log_File:
                        Until_Log_Pos: 0
                   Master_SSL_Allowed: No
                   Master_SSL_CA_File:
                   Master_SSL_CA_Path:
                      Master_SSL_Cert:
                    Master_SSL_Cipher:
                       Master_SSL_Key:
                Seconds_Behind_Master: 0
        Master_SSL_Verify_Server_Cert: No
                        Last_IO_Errno: 0
                        Last_IO_Error:
                       Last_SQL_Errno: 0
                       Last_SQL_Error:
          Replicate_Ignore_Server_Ids:
                     Master_Server_Id: 100
                          Master_UUID: 8c7e9e61-a265-11eb-907c-0242ac110002
                     Master_Info_File: /var/lib/mysql/master.info
                            SQL_Delay: 0
                  SQL_Remaining_Delay: NULL
              Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
                   Master_Retry_Count: 86400
                          Master_Bind:
              Last_IO_Error_Timestamp:
             Last_SQL_Error_Timestamp:
                       Master_SSL_Crl:
                   Master_SSL_Crlpath:
                   Retrieved_Gtid_Set:
                    Executed_Gtid_Set:
                        Auto_Position: 0
        1 row in set (0.00 sec)

  1. 测试安装是否成功
1
2
3
4
5
6
7
测试主从同步是否成功

在服务器上创建一个数据库,在从服务器上查看
在主服务器新创建的库中新创建一张表,在从服务器中查看
在主服务器中插入一条数据,在从服务器中查看

注意: 由于我们使用的root账户进行操作,这时候从数据库也是可以进行数据修改的,但是从数据库不会将数据同步到主数据库,你可以设置将从数据库设置成只读,这里不做介绍.

以上MySQL的主从架构就设计完成了.接下来就是配置中间件Atlas


三、Atlas的安装/配置

  • 官网地址
    1
    
    https://github.com/Qihoo360/Atlas/blob/master/README_ZH.md
    
  • 下载地址
    1
    
    https://github.com/Qihoo360/Atlas/releases/download/2.2.1/Atlas-2.2.1.el6.x86_64.rpm
    
  • 安装注意事项
    1
    2
    3
    4
    5
    
    1. Atlas只能安装在64位系统上
    2. Centos 5.X安装 Atlas-XX.el5.x86_64.rpm,Centos 6.X安装Atlas-XX.el6.x86_64.rpm
    3. 我在Centos7.x上面安装Atlas-XX.el6.x86_64.rpm也没问题
    4. 如果本机安装过,那么需要先卸载
    5. mysql版本应大于5.1,建议使用Mysql 5.6
    
  • 安装步骤
    1
    2
    3
    4
    
    Atlas安装及其简单只需要一条命令很快安装完成
    sudo rpm –i Atlas-XX.el6.x86_64.rpm
    安装目录在/usr/local/mysql-proxy下
    安装好之后就是配置介绍
    
  • 配置文件(/usr/local/mysql-proxy/conf/test.cnf)

里面介绍了一些非必须的配置,我这里将非必须的都删除掉,如果有需要请自行查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
[mysql-proxy]

#管理接口的用户名(默认即可,进入管理客户端的用户名,非操作数据库的用户名)
admin-username = user

#管理接口的密码(默认即可)
admin-password = pwd

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

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

#用户名与其对应的加密过的MySQL密码,密码使用PREFIX/bin目录下的加密程序encrypt加密,下行的root为示例,将其替换为你的MySQL的用户名和加密密码!
pwds = root:/iZxz+0GRoA=

#设置Atlas的运行方式,设为true时为守护进程方式,设为false时为前台方式,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
daemon = true

#设置Atlas的运行方式,设为true时Atlas会启动两个进程,一个为monitor,一个为worker,monitor在worker意外退出后会自动将其重启,设为false时只有worker,没有monitor,一般开发调试时设为false,线上运行时设为true,true后面不能有空格。
keepalive = true

#工作线程数,对Atlas的性能有很大影响,可根据情况适当设置
event-threads = 2

#日志级别,分为message、warning、critical、error、debug五个级别
log-level = message

#日志存放的路径
log-path = /usr/local/mysql-proxy/log

#实例名称,用于同一台机器上多个Atlas实例间的区分
#instance = test

#Atlas监听的工作接口IP和端口,相当于MySQL的3306端口,用于操作数据库的,以前我们都是直连数据库,现在我们连接中间件即可.
proxy-address = 0.0.0.0:1234

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

上面就是Atlas的最简配置,如果有什么特殊需要请查看详细官网,地址为

1
https://github.com/Qihoo360/Atlas/wiki/Atlas%E7%9A%84%E5%AE%89%E8%A3%85

四、Atlas的启动和测试

  • 启动
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    进入/usr/local/mysql-proxy/bin目录,执行下面的命令启动、重启或停止Atlas.
    (1). sudo ./mysql-proxyd test start   启动Atlas。
    (2). sudo ./mysql-proxyd test restart 重启Atlas。
    (3). sudo ./mysql-proxyd test stop    停止Atlas。
    
    注意:
    1. 运行文件是:mysql-proxyd(不是mysql-proxy)
    2. test是conf目录下配置文件的名字,也是配置文件里instance项的名字,三者需要统一
    3. 可以使用ps -ef | grep mysql-proxy查看Atlas是否已经启动或停止
    
  • 测试

测试1234端口号,是否能操作数据库

1
mysql -uroot -h192.168.1.134 -P1234 -p123456

测试2345端口号,是否能进入管理控制台,对MySQL集群进行管理

1
2
3
4
5
6
7
mysql -uuser -h192.168.1.134 -P2345 -ppwd

通过select * from help;查看管理DB的各类命令

1. SELECT * FROM backends; 查看当前MySQL的服务节点列表
2. SELECT * FROM pwds;     查看MySQL加密之后的密码
3. SELECT VERSION;         查看当前Atlas版本

以上为Atlas的设计,如果想了解其他的比如说高可用,可以查看官网地址为:

1
https://github.com/Qihoo360/Atlas/wiki/Atlas%E7%9A%84%E6%9E%B6%E6%9E%84

五、MyBatis连接Atlas操作数据库

1
2
3
略,和操作单点数据库一模一样

注意: 由于MySQL数据库版本较低,所以对应MySQL的驱动尽量做到兼容,替换成5.x

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194967.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

屏幕录制没有声音怎么办?看看你有没有打开这个设置

电脑是我们学习和办公不可或缺的工具,有时我们需要使用工具对电脑屏幕进行录制。但很多小伙伴录制的电脑录屏文件只有画面没有声音。屏幕录制没有声音怎么办?不用慌!有可能你只是忘了在录制前打开这个设置。今天小编就来教大家录制前需要开启…

公司企业如何制作微信小程序店铺?

​微信小程序除了可以为公司企业充当展示官网之外,有些主打线上销售商品的公司企业也会借助小程序来卖货,那就是我们常说的微信小程序店铺。那么公司企业如何制作微信小程序店铺?下面给大家做个讲解。 一、注册小程序账号 微信小程序店铺也属…

有效管理 Kubernetes 的流行解决方案,7 款 DevOps 工具管理 Kubernetes ,集群管理更加的轻松顺畅和高效

有效管理 Kubernetes 的流行解决方案,7 款 DevOps 工具管理 Kubernetes ,集群管理更加的轻松顺畅和高效。 在新兴的云原生环境中,Kubernetes无处不在。它已成为编排容器的标准。但是,管理多个 Kubernetes 集群(必须以…

前端整理 —— 前端安全

1. XSS(跨站脚本攻击) 什么是XSS 是一种代码注入攻击。攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如Cookie、SessionID等,进而危害数据安全常见类型…

【并发编程十四】c++原子操作(2)——实现自旋锁

【并发编程十四】c原子操作(2)——实现自旋锁一、自旋锁简介二、使用自旋锁三、不使用自旋锁四、分析简介 在介绍完原子操作,我们这篇使用c提供的原子操作,实现一个自旋锁,并加以利用。 原子操作参见【并发编程十三】…

什么是shell?shell在Linux内怎么编写脚本?

目录 一、概念 二、简单创建脚本 三、shell语法 1.变量 2.环境变量 3.参数变量 4.条件 5.控制结构 if语句 elif语句 for语句 一、概念 什么是shell? shell是一个作为用户与Linux系统间接口的程序,它允许用户向操作系统输入需要执行的命令。 下图显示了sh…

kali之setoolkit使用

kali之setoolkit使用 1 搭建钓鱼网站 钓鱼网站是黑客常用的用于盗取目标用户名与账号的方式,今天主要介绍setoolkit来制作钓鱼网站 setoolkit是kali下的社会工程学工具集。 ①进入setoolkit 命令行输入: setoolkit②选择社会工程学攻击 - 网络攻击 - …

基于Android的二手车交易系统

需求信息: 1、登录功能:用户可以注册登录,管理员可以给销售人员权限,所以销售人员只能登陆。 2、维护车辆信息:主要实现的是客户添加修改查询删除车辆信息,然后发布车辆需要提交,提交给管理员,管理员审核了…

四、Executor执行器【无标题】

Executor Executor 接口定义了数据库操作的基本方法,其中 query*() 方法、update() 方法、flushStatement() 方法是执行 SQL 语句的基础方法,commit() 方法、rollback() 方法以及 getTransaction() 方法与事务的提交/回滚相关,clearLocalCac…

Python快速入门

最近在很多地方都可以看到Python的身影,尤其在人工智能等科学领域,其丰富的科学计算等方面类库无比强大。很多身边的哥们也提到Python非常的简洁方便,比如用Django搭建一个见得网站只需要半天时间即可,因此也吸引了我不小的兴趣。…

二叉树:删除二叉搜索树中的节点

删除二叉搜索树中的结点 一、题目描述 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除…

2023牛客寒假算法基础集训营5(通过ABCDHIKL) I题有详解(F已补)

其他题待补中…… 链接:2023牛客寒假算法基础集训营5 简单题 A 小沙の好客(贪心,前缀和,二分) 题意思路 给定nnn个商品的价值,qqq次询问,每次询问k,xk, xk,x即价值不超过xxx的商品最多可以拿…

文件输入输出缓冲流IO综合练习——学生管理系统文件版

综合练习(一) 键盘录入3个学生信息(学号,姓名,年龄,居住城市)存入集合。然后遍历集合把每一个学生信息存入文本文件(每一个学生信息为一行,自己定义分割标记) 学生类: package com.itheima; /** 标准的学生类*/ public class St…

【数据结构 (3)】1.4 算法和算法分析

文章目录1. 算法的定义及特性算法的特性算法设计的要求2. 算法的时间复杂度分析算法时间复杂度的基本方法算法时间复杂度分析例题算法时间复杂度的计算3. 算法的空间复杂度1. 算法的定义及特性 算法的定义 对特定问题求解方法和步骤的一种描述,它是指令的有限序列…

WSL-Ubuntu 安装、移动

设置” 启用或者关闭Windows功能“,勾选如下选项。Hyper-v若存在灰色,可进入BIOS-Configuration,Intel Virtual Technology设置Enable重启2、安装Ubuntu3、移动。Ubuntu默认安装C盘。首先D盘创建移动的目录,例如:D:\Ub…

使用kubeadm搭建高可用k8s集群

使用kubeadm搭建高可用k8s集群方案选型高可用k8s集群部署准备工作服务器统一配置配置hostname打通ssh免密登录部署etcd集群step1 在master01上生成配置相关文件step2 每台服务器上启动etcd服务step3 检查etcd集群是否正常部署负载均衡 (haproxy keepalived)step1 下载haproxy与…

SAP 分析云 2023.012023.02 版新功能抢先看

大家新年好呀!本年度的第一篇推文来啦~本文介绍了SAP 分析云2023.01&2023.02 版本的新功能。这些新功能已经在SAP 分析云FastTrack 客户的系统上线。对于 SAP 分析云季度发布周期 (QRC) 客户,此版本及其功能将作为 QRC 2023 年第1季度版本的一部分提…

[Android开发基础3] Activity的生命周期、创建与配置

文章目录 生命周期 概念 生命周期周期函数 创建Activity 方法一:编译器自动创建与配置 方法二:手动创建与配置 生命周期 概念 生命周期,顾名思义,就是当前的程序单元Activity从启动到销毁之间一系列所经过的状态。 生命周期周…

怎么画室内导航地图,室内地图绘制工具

现在很多楼宇建的越来越大,停车场、商场、展览馆、博物馆、交通枢纽等大型室内场景规模巨大、环境复杂,人们置身其中,一不小心就走错方向,从而多走很多弯路,费时费力。室内导航一直是导航场景的一大难题,如…

【redis6】第十四章(Redis集群)

问题 容量不够,redis如何进行扩容? 并发写操作,redis如何分摊? 另外,主从模式,薪火相传模式,主机宕机,导致ip地址发生变化,应用程序中配置需要修改对应的主机地址、端…