易陆发现互联网技术论坛

 找回密码
 开始注册
查看: 5322|回复: 2
收起左侧

设置自动清理MySQL binlog日志

[复制链接]
发表于 2017-9-7 09:23:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?开始注册

x

+ Q. q  B/ T% z5 y8 ^7 i+ q3 e
1 H* B% j  M- x3 U8 x! |
mysql -uroot -p123456 -e 'PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ),INTERVAL 5 DAY)';
#mysql 定时清理5天前的binlog
mysql -u root -p  #进入mysql 控制台
reset master;  #重置binlog

; q, N4 K+ C2 J! m7 N6 u1 Y8 }! G" ^# [* S. ^
show master log;   #获得主服务器上的一系列日志
2 L3 a' ?- A. h4 G* F
PURGE MASTER LOGS TO 'binlog.000058';   #删除binlog.000005之前的,不包括binlog.0000588 M# l+ L/ T0 M
PURGE MASTER LOGS BEFORE '2016-06-22 13:00:00';  #清除2016-06-22 13:00:00前binlog日志
7 u4 \* R% ~9 q6 j  c3 EPURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);  #清除3天前binlog日志$ ]5 `  E- S  L( L6 v
+ T1 X9 V) U  D

/ I# Y1 b3 s3 c$ Gvi  /etc/my.cnf  #编辑配置$ Y) X% \1 ?( M7 `
expire_logs_days = 15 #自动删除15天前的日志。默认值为0,表示从不删除。. J9 A) _5 f+ q
log-bin=mysql-bin #注释掉之后,会关闭binlog日志+ `0 f4 s; z& t* w8 y
binlog_format=mixed #注释掉之后,会关闭binlog日志
/ m6 k: b( N( {9 d) r9 W9 a; W$ _0 N
:wq!  #保存退出
扩展阅读:
mysql> help purge;
Name: 'PURGE BINARY LOGS'
Description:
Syntax:
PURGE { BINARY | MASTER } LOGS
{ TO 'log_name' | BEFORE datetime_expr }
The binary log is a set of files that contain information about data
modifications made by the MySQL server. The log consists of a set of
binary log files, plus an index file (see
http://dev.mysql.com/doc/refman/5.5/en/binary-log.html).
The PURGE BINARY LOGS statement deletes all the binary log files listed
in the log index file prior to the specified log file name or date.
BINARY and MASTER are synonyms. Deleted log files also are removed from
the list recorded in the index file, so that the given log file becomes
the first in the list.
This statement has no effect if the server was not started with the
--log-bin option to enable binary logging.
Examples:
PURGE BINARY LOGS TO 'mysql-bin.010';
PURGE BINARY LOGS BEFORE '2008-04-02 22:46:26';
下面是其它网友给出的方法,大家可以参考一下
MYSQL主从复制(replication)采用 RBR 模式后,binlog的格式为"ROW",能解决很多原先出现的主键重复问题。1 S. x2 G1 V2 m0 v, M
在一个繁忙的master db server上,binlog日志文件增长速度很快,如果不定时清除,硬盘空间很快就会被充满。8 @" X4 v) P3 c9 z9 B  F/ U# g
设置自动清理mysql binlog日志,配置my.cnf:
expire_logs_days = 10
在运行时修改:
show binary logs; ( p/ t" Y' V" @6 @: |
show variables like '%log%'; * C$ u, d+ i) b# D  }
set global expire_logs_days = 10;
清除之前可以采用相应的备份策略。
手动删除10天前的MySQL binlog日志:
PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY);) C. N2 J9 _' Y8 c$ m0 W& P
show master logs;
MASTER和BINARY是同义词。
一般情况下,推荐使用MIXED binlog的复制。http://dev.mysql.com/doc/refman/5.1/en/open-bugs-general.html中的说明:Replication uses query-level logging: The master writes the executed queries to the binary log. This is a very fast, compact, and efficient logging method that works perfectly in most cases.
附:关于MYSQL复制的几种模式

& |5 b9 J: \/ R0 M从 MySQL 5.1.12 开始,可以用以下三种模式来实现:
7 C& @3 D; v" J8 I$ N" i$ b$ y– 基于SQL语句的复制(statement-based replication, SBR),
: v0 x2 P6 x2 {3 }5 N– 基于行的复制(row-based replication, RBR),( z  v( V  i& j# W4 b) g6 Y
– 混合模式复制(mixed-based replication, MBR)。& H8 K& K0 L7 X. B% B
相应地,binlog的格式也有三种:STATEMENT,ROW,MIXED。 MBR 模式中,SBR 模式是默认的。
在运行时可以动态改动 binlog的格式,除了以下几种情况:2 y8 L4 V) }& T! k& a2 Z8 [. v
. 存储流程或者触发器中间2 m! [9 o7 D; G3 I
. 启用了NDB/ D  w' L" w1 G' |4 q, }
. 当前会话试用 RBR 模式,并且已打开了临时表
如果binlog采用了 MIXED 模式,那么在以下几种情况下会自动将binlog的模式由 SBR 模式改成 RBR 模式。
) P9 X# [1 y& z8 c1 Q0 S. 当DML语句更新一个NDB表时
2 V7 p1 o  O) [. 当函数中包含 UUID() 时5 G6 h' r# {) C9 e9 s9 G
. 2个及以上包含 AUTO_INCREMENT 字段的表被更新时; T" W% i1 v3 p3 j5 o0 A* G
. 行任何 INSERT DELAYED 语句时  m9 w% C* R3 k4 Y2 C& v* T' t8 ~
. 用 UDF 时+ c" W+ r4 m' F7 ~
. 视图中必须要求运用 RBR 时,例如建立视图是运用了 UUID() 函数
设定主从复制模式:- v+ s# c4 x1 Y1 A3 a4 A
log-bin=mysql-bin
+ ?2 g; k, ]. ^8 `#binlog_format="STATEMENT": S8 p) P1 e5 t4 ^
#binlog_format="ROW"' y) I4 s* ^1 \+ R% |- |
binlog_format="MIXED"
也可以在运行时动态修改binlog的格式。例如  \$ e1 Y4 q) _( N; ]  u
mysql> SET SESSION binlog_format = 'STATEMENT';
* `0 m' T5 |  n7 e/ `- F" ymysql> SET SESSION binlog_format = 'ROW';" v1 _1 t& J+ I. d
mysql> SET SESSION binlog_format = 'MIXED';4 _. N* n, N& K
mysql> SET GLOBAL binlog_format = 'STATEMENT';$ @1 [; `+ _: k. V
mysql> SET GLOBAL binlog_format = 'ROW';
5 c. A; ?0 S0 J) d% o% Kmysql> SET GLOBAL binlog_format = 'MIXED';
两种模式各自的优缺点:
SBR 的优点:
6 c# T* S/ J: P" r( i6 I历史悠久,技能成熟
7 _" a- J7 D! ?1 Z! Zbinlog文件较小
* e; c2 V% ~% Z) `- R* Dbinlog中包含了所有数据库修改信息,可以据此来审核数据库的安全等情况
5 k$ M$ ?  y( k6 F+ d, N8 P" ^binlog可以用于实时的还原,而不仅仅用于复制
# z% @) u* Z) D! |主从版本可以不一样,从服务器版本可以比主服务器版本高
. q6 }, ]- v1 Y$ t8 z7 GSBR 的缺点:8 H6 _: p' ^4 T! J$ ]0 A
不是所有的UPDATE语句都能被复制,尤其是包含不确定操作的时候。
" I" H$ p& `. d$ \# h# f( ?调用具有不确定因素的 UDF 时复制也可能出疑问. {6 W, }( M2 A) [: p
运用以下函数的语句也不能被复制:
6 k: F" O; K" e) K. h' _% Z* LOAD_FILE()/ z  l5 b& v4 B8 \
* UUID()6 Q1 a6 x. B6 b5 s: W6 {
* USER()
2 K9 r- l2 _4 e9 g0 x5 v( _. E* FOUND_ROWS(). c0 F, Z) y: @6 c3 G5 e( V1 _
* SYSDATE() (除非启动时启用了 –sysdate-is-now 选项)
6 }$ r. ^  b  v! w  }& l0 NINSERT … SELECT 会产生比 RBR 更多的行级锁& `; X' y' ^5 N1 r% `8 x5 m
复制须要执行 全表扫描(WHERE 语句中没有运用到索引)的 UPDATE 时,须要比 RBR 请求更多的行级锁
7 D4 E$ k3 V" n+ z: f# j! l* b8 ?对于有 AUTO_INCREMENT 字段的 InnoDB表而言,INSERT 语句会阻塞其他 INSERT 语句
9 |, m' E3 \$ u) M7 K2 \' a. A对于一些复杂的语句,在从服务器上的耗资源情况会更严重,而 RBR 模式下,只会对那个发生变化的记录产生影响5 R# r! y3 j' M9 N& s1 T7 Q0 ~1 B
存储函数(不是存储流程 )在被调用的同时也会执行一次 NOW() 函数,这个可以说是坏事也可能是好事
8 }  I1 R/ C- k0 m, O/ c确定了的 UDF 也须要在从服务器上执行
( e. o8 f( ]/ b# e数据表必须几乎和主服务器保持一致才行,否则可能会导致复制出错
6 E) u8 M! ^/ z/ k" N执行复杂语句如果出错的话,会消耗更多资源
RBR 的优点:  W4 R2 ], d# ^
任何情况都可以被复制,这对复制来说是最安全可靠的
# t  s0 \& e/ F* U/ Y- l和其他大多数数据库系统的复制技能一样: i' O0 }$ O& M, \% `) P
多数情况下,从服务器上的表如果有主键的话,复制就会快了很多
( {* w  y% H/ l! t: D* r复制以下几种语句时的行锁更少:
) p+ r3 J* _6 Q0 ]  ~: R3 r" ~7 I* INSERT … SELECT
  ~5 R* R" P3 a* 包含 AUTO_INCREMENT 字段的 INSERT3 f- L2 D1 V/ p) L
* 没有附带条件或者并没有修改很多记录的 UPDATE 或 DELETE 语句, e; e& I  N1 u3 r* m" `. M( U7 U( n
执行 INSERT,UPDATE,DELETE 语句时锁更少
9 l5 x* }) S. C+ r1 I从服务器上采用多线程来执行复制成为可能
, {. m' {, F; w1 o- D1 bRBR 的缺点:3 |6 w/ c6 [) [1 J3 M
binlog 大了很多
! W, a/ [: }0 X1 J% D5 R复杂的回滚时 binlog 中会包含大量的数据- G9 q3 j5 M' _" H* D
主服务器上执行 UPDATE 语句时,所有发生变化的记录都会写到 binlog 中,而 SBR 只会写一次,这会导致频繁发生 binlog 的并发写疑问
2 B( w, ?- t, K9 mUDF 产生的大 BLOB 值会导致复制变慢, z- p5 p6 S3 J! T( ?1 E( c  Q
不能从 binlog 中看到都复制了写什么语句(加密过的)9 X/ O/ d/ s9 |9 a
当在非事务表上执行一段堆积的SQL语句时,最好采用 SBR 模式,否则很容易导致主从服务器的数据不一致情况发生
. v- Z& v* y- `! b另外,针对系统库 mysql 里面的表发生变化时的处理准则如下:7 h8 ~, ], t( }% {8 n9 a
如果是采用 INSERT,UPDATE,DELETE 直接操作表的情况,则日志格式根据 binlog_format 的设定而记录
1 F! z) X0 e0 o/ \  Q1 ^( W" n如果是采用 GRANT,REVOKE,SET PASSWORD 等管理语句来做的话,那么无论如何 都采用 SBR 模式记录。
0 a/ z. [# M& l/ V* q5 t注:采用 RBR 模式后,能处理很多原先出现的主键重复问题。实例:6 S  V" V5 P, ]) i- d! i, g
对于insert into db_allot_ids select * from db_allot_ids 这个语句:
2 {: V4 z3 `: T) ?在BINLOG_FORMAT=STATEMENT 模式下:$ T: H" j- B1 O1 r9 |
BINLOG日志信息为:' v5 j+ A' u- y* b
—————————————–
- E7 i) d  f% s: pBEGIN
* s8 Y* g0 Q2 t6 s* |( B3 C- |/*!*/;
  G- g4 ~$ V/ j# b- B# at 1739 a2 Y' x3 S6 A
#090612 16:05:42 server id 1 end_log_pos 288 Query thread_id=4 exec_time=0 error_code=0
1 C+ g2 X  q& d+ b2 O/ v' pSET TIMESTAMP=1244793942/*!*/;
5 b3 a3 P7 B8 m6 rinsert into db_allot_ids select * from db_allot_ids
' f; M/ q) y8 l* T, c: B5 D/*!*/;+ j  p# w  N* x( M. H; x- W  o1 L- |
—————————————–
在BINLOG_FORMAT=ROW 模式下:
/ s7 t, g$ [. h% V7 r8 tBINLOG日志信息为:( y5 b8 t- @: @4 w* D
—————————————–
2 Y3 B( Z; N0 d: ~; ?BINLOG '
2 Q7 U- J1 B1 W0 v% q9 \; ZhA0yShMBAAAAMwAAAOAAAAAAAA8AAAAAAAAAA1NOUwAMZGJfYWxsb3RfaWRzAAIBAwAA
0 Q9 r0 X9 Q+ g" W0 g+ ^+ C7 LhA0yShcBAAAANQAAABUBAAAQAA8AAAAAAAEAAv/8AQEAAAD8AQEAAAD8AQEAAAD8AQEAAAA=' m+ u. r7 P$ U4 r
'/*!*/;8 G8 `1 J: o* q8 ^& s
—————————————–

- L  z! G5 ^* ^& s) t" A6 v, G/ e0 c清理日志步骤
' }+ e* ^9 {; U7 @1.查找日志档案+ ?2 {' X) d* e* E8 F* D
mysql> show binary logs;5 |+ E- N1 i' {
+----------------+-----------+
) T2 i! C7 \" P, s3 v2 c| Log_name       | File_size |
: L6 p0 {' K# r6 A" ]+----------------+-----------+
1 U# Q; t& M2 O" y+ |* y; t4 p  c| ablelee.000001 | 150462942 |
, I, Z! Z! s6 \, d| ablelee.000002 |       125 |$ }7 E1 \, ^% c, F- v! g& U2 S9 K
| ablelee.000003 |       106 |
1 A0 u& P  d' w8 b+----------------+-----------+
5 a% C1 j4 E6 q$ ?8 d2.删除bin-log(删除ablelee.000003之前的而没有包含ablelee.000003)
8 y2 B. q& d! m9 @8 f" Umysql> purge binary logs to 'ablelee.000003';. p0 I8 t) n/ Z
Query OK, 0 rows affected (0.16 sec)
3.  查询结果(现在只有一条记录了.)
mysql> show binlog events\G
5 z5 W4 n2 ?9 G: Z4 a$ [7 p*************************** 1. row ***************************
7 U& L6 ~" `" x9 Q. ]# m   Log_name: ablelee.000003
9 V7 F0 }) I+ i! R  l/ J        Pos: 4
" j* N: b1 \! T& Y$ J Event_type: Format_desc: H" t/ x$ [4 d/ t9 |9 X+ W
  Server_id: 1
& T# ~  ?+ D: I; c% jEnd_log_pos: 106
, Y0 t3 }2 J( K% H# q       Info: Server ver: 5.1.26-rc-log, Binlog ver: 4
3 m. y. A/ u" T2 J- i- J& u" Q1 row in set (0.01 sec)
) N; w  m- |( c# P" E" p(ablelee.000001和ablelee.000002已被删除)& }8 k2 x" Z) p$ g/ c; d4 o8 T
mysql> show binary logs;. q2 G; g+ X  z4 U
+----------------+-----------+
; Z. O, U6 R& @% n0 k| Log_name       | File_size |* k9 K% S) `- P( V* j$ M
+----------------+-----------+' {* z3 Z. y& v6 q
| ablelee.000003 |       106 |+ i1 m; y$ b3 g9 l
+----------------+-----------+  s/ c/ ?3 Y2 b
1 row in set (0.00 sec)
. _2 j4 U* Q3 ?; f/ E/ A1 T. o) h# W( Z
3 k& V' N# y' @' \/ W' o/ P(删除的其它格式运用!)- `4 O) ~# g, j( p, A
   PURGE {MASTER | BINARY} LOGS TO 'log_name'
  P/ k" H# v) D3 L0 _6 d  PURGE {MASTER | BINARY} LOGS BEFORE 'date'$ x6 g' ]7 c5 A1 T* A, Y8 a+ }6 N# x$ e5 V
  用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。
, x) V8 u0 X: @4 ?  |/ f  例如:
- @# R3 }- X: e, W, @/ Y  PURGE MASTER LOGS TO 'mysql-bin.010';
& q3 A. Z, P% v. k3 e3 m  B4 ]  PURGE MASTER LOGS BEFORE '2008-06-22 13:00:00';
. q& \$ T4 p1 e0 o+ w    清除3天前的 binlog
: n! ?6 ]+ n% u  G6 g    PURGE MASTER LOGS BEFORE DATE_SUB( NOW( ), INTERVAL 3 DAY);
" Y3 O. B: X# i7 S8 t% z8 \  BEFORE变量的date自变量可以为'YYYY-MM-DD hh:mm:ss'格式。MASTER和BINARY是同义词。, R: z' }8 k- }. T
  如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。: h8 j+ I4 `9 U
  要清理日志,需按照以下步骤:
! l* @6 I8 l* {) q9 x- \" H  1. 在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。# ]" _9 t9 T6 G! @. \, ]6 Z
  2. 使用SHOW MASTER LOGS获得主服务器上的一系列日志。
7 O) O3 n. H5 w. l" D9 G8 n  3. 在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。
  4. 制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)
  5. 清理所有的日志,但是不包括目标日志
, x/ }! a7 z/ c( H% l

: s- I  z" G8 M4 w" U/ R* q9 ?) g* B8 @* f% F

# A8 {2 R# m7 H) O/ J) I
[2017.03.15 修订]   本来作为一篇读书笔记性质写的文章,重新再读,发现疏漏不少,貌似还被不少地方转载了,误人子弟了,修改一下,希望错漏少些,看官们见谅,呵呵。
部分图片引用自《Galera Cluster Best Practices》
--------------------------
一、Galera Cluster介绍
Galera是一个MySQL(也支持MariaDB,Percona)的同步多主集群软件。
从用户视角看,一组Galera集群可以看作一个具有多入口的MySQL库,用户可以同时从多个IP读写这个库。
目前Galera已经得到广泛应用,例如openstack中,在集群规模不大的情况下,稳定性已经得到了实践考验。

0 S0 i1 w8 [) B2 s

9 D0 o3 |) s- P6 q) D: _; l                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" action-data="http%3A%2F%2Fs5.sinaimg.cn%2Fmw690%2F0023u9s8zy79wbYP7HCf4%26690" action-type="show-slide" style="border-width: 0px; border-style: initial; list-style: none;">

6 a4 Y& i9 l8 d3 l; X- h0 g( {* O; J+ _- P1 Q& m+ B# i
主要特点:

. y. o* }" m. M+ s- m. D2 P& T+ g9 e
  • 同步复制
    4 S# M3 @! g8 F$ e% n' n

  R' K/ v9 C3 Y; j+ N! P

" s4 D4 `# h. I# c5 Q& o. K                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" action-data="http%3A%2F%2Fs11.sinaimg.cn%2Fbmiddle%2F0023u9s8zy79wc28POida%26690" action-type="show-slide" style="border-width: 0px; border-style: initial; list-style: none;">

- E, u# ]# z. T
5 O' _9 H( s* a$ }# L/ F
3 y6 i7 W0 w* q+ h

* h# n3 U4 E; E! @3 w                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" style="border-width: 0px; border-style: initial; list-style: none;">
/ r! [# B3 H- ^6 j+ f

7 C) \+ m  e# E+ G% F- D
# r$ O- d; Q) }6 V1 n  Y4 }! Y
' y  b( e# K) L: f8 C" \* ^8 w5 w
                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" action-data="http%3A%2F%2Fs14.sinaimg.cn%2Fmw690%2F0023u9s8zy79wc3djWt3d%26690" action-type="show-slide" style="border-width: 0px; border-style: initial; list-style: none;">

2 |8 X# M  Q, d/ n( B: ~  o8 h

9 v2 |: U- W7 u, ^& N" [
( _" a. B: k+ _% v' Z5 _/ m
  • 真正的multi-master,即所有节点可以同时读写数据库5 T& @( d+ ^) V7 V% T* V& k, I
; G- T, r+ y5 Y$ a( G+ C: v' l0 ~

0 ^9 q1 A- ^% D, I4 O( d) q5 m+ G                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" style="border-width: 0px; border-style: initial; list-style: none;">

1 v8 M# M) h: j
2 J! d+ J* c. k

) J: N, U) N0 `! Y
  • 自动的节点成员控制,失效节点自动被清除
  • 新节点加入数据自动复制
  • 真正的并行复制,行级
  • 用户可以直接连接集群,使用感受上与MySQL完全一致. N1 y0 ~1 V$ q- o
9 u) h: K( K) }! ]8 z- W: t2 L# `
优势:
" K& p  M- ^$ O; B0 c
因为是多主,所以不存在Slave lag

. n6 M' v- i. B% {
不存在丢失交易的情况
$ a! E. C! Q* r3 [: K- x" h
同时具有读和写的扩展能力
' H: j& ^  t) C
更小的客户端延迟
, A# o3 }% \+ I/ l* D8 A
节点间数据是同步的,而Master/Slave模式是异步的,不同slave上的binlog可能是不同的

! A" I/ e' c* {: v0 `# ^* |
技术:
/ d9 u, E- |7 v& O" m
Galera集群的复制功能基于Galera library实现,为了让MySQL与Galera library通讯,特别针对MySQL开发了wsrep API。

5 R2 Z! {9 Y9 _3 y3 ?; c
3 G# S! J7 b: x9 l: e/ s; f( z: N
                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" action-data="http%3A%2F%2Fs8.sinaimg.cn%2Fbmiddle%2F0023u9s8zy79wcdFnLh57%26690" action-type="show-slide" style="border-width: 0px; border-style: initial; list-style: none;">
. Z& w( T; ]9 G$ c* y3 j

6 H& c( E) s  ^- z

( ]) i9 d0 r. {( i, N
. r1 o/ X) i1 m9 M5 {3 A
                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" action-data="http%3A%2F%2Fs6.sinaimg.cn%2Fbmiddle%2F0023u9s8zy79wceSyVva5%26690" action-type="show-slide" style="border: 0px; list-style: none;">

7 v& F- r9 b  C# O/ Y

4 t1 L- ]8 L' L1 H* K0 n0 p
. I1 e8 T2 x& a( n% Z
6 v) k/ O6 r9 j" \
                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" style="border-width: 0px; border-style: initial; list-style: none;">

8 A3 ~) O2 y/ y# t0 ]3 I- I3 r

7 G7 n* m; M, g" {1 D1 K
[2017.03.15 修订]
    MySQL官方自5.7版本后推出了Group Replication,同样支持多主写入,功能和Galera类似,"官方控"可以去看看。
( r5 @- F. u2 }2 g
    Galera集群中,后加入的节点叫“joiner”,joiner会向之前的节点请求同步数据,接受同步请求的节点叫“donor”,同步可以通过IST: incremental state transfer 和SST: full state transfer两种方式,支持的wsrep_sst_method有mysqldump,rsync,xtrabackup三种。其中xtrabackup锁表的时间最短,同步速度最快,所以一般选择xtrabackup。
    无论采用哪种方法,都会短暂锁表,如果对这个比较敏感,那么可以采用专用的“参考节点”,即该节点不对用户开放,也不执行任何SQL操作。
$ q; h+ Q0 h7 G8 }
                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" style="border-width: 0px; border-style: initial; list-style: none;">

& ]+ _( i; X' b7 y# K3 a3 \

5 h0 d, t" ]1 N3 N8 S) W
二、Galera安装流水账

' T) X( q' ]+ O0 d6 p
2.1 Galera与SElinux

0 A- q/ J2 U2 h/ j3 Q1 Z
2.1.1 将SElinux置为”permissive“状态# i2 b- X. a4 Q# M5 x3 `
2.1.2 安装好Galera集群,然后做如下各种操作,获取SELinux的events log
; ~# T1 l* Y- `3 R7 ], v) h" {, x
启动节点
* Z. P+ Y& C! ^+ \; Z
停止节点服务,在其他节点做插入,删除,更新操作,重启服务
( W% r9 k7 z& ^$ S
停止节点服务,删除grastate.dat文件,重启服务/ O* b' b1 ?5 M" g
直接重启节点
& G1 q0 {" p% K" h4 D% @0 [
尽量将日常操作都做过一遍。
+ z0 |5 ^8 U' d* |: b: B3 j
2.1.3 据SElinux日志来生成policy文件,编译为module后打包,加载
$ o1 A( w6 D( l* \
]# fgrep "mysqld" /var/log/audit/audit.log | audit2allow -m MySQL_galera -o galera.te5 N( H' V$ l9 \( [4 c( ]
]# checkmodule -M -m galera.te -o galera.mod
7 g4 m, |; u3 ~9 b2 E* O: ]
]# semodule_package -m galera.mod -o galera.pp.9 j8 u/ Y8 f7 y: d6 K( c
]# semodule -I galera.pp: l1 F1 k, B( ~( R$ ?4 s
2.1.4 将SElinux恢复为“enforcing”状态
  U1 q# l1 L& k% L" Z1 ]6 P4 `1 a  M* T! x
2.2 安装MariaDB
[在每个节点上]
2.2.1 加入MariaDB官方源
]# vim /etc/yum/repos.d/MariaDB.repo
[mariadb]
name = MariaDB
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
3 {) U" `* H) ?8 |, D( V
2.2.2 安装MariaDB,Galera,xtrabackup
]# yum install MariaDB-client MariaDB-Galera-server galera xtrabackup
8 @9 ?$ L' b8 s
2.2.3 启动MariaDB,并作安全加固
]# service mysql start
]# /usr/bin/mysql_secure_installation
1 J2 m4 b* y! O# A$ j. K5 T2 c' E5 I
2.2.4 增加SST用户,用于同步数据
]# mysql -u root -p
mysql> GRANT ALL PRIVILEGES on *.* to sst_user@'%' IDENTIFIED BY 'dbpass';
mysql> FLUSH PRIVILEGES;
mysql> quit
注意:为了安全,尽量不要用‘%’,而是指定的集群节点IP。

( r6 o! J2 C# j! S
2.2.5 停止MariaDB,编辑Galera配置文件
]# service mysql stop
]# vi /etc/my.cnf.d/server.cnf
binlog_format=ROW
default-storage-engine=innodb
innodb_autoinc_lock_mode=2
innodb_locks_unsafe_for_binlog=1
query_cache_size=0
query_cache_type=0
bind-address=0.0.0.0
datadir=/var/lib/mysql
innodb_log_file_size=100M
innodb_file_per_table
innodb_flush_log_at_trx_commit=2

0 Q; w# a. o: x
# Galera Provider Configuration
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
7 X5 ~* I! X+ [; l" w% S7 W
# Galera Cluster Configuration
wsrep_cluster_address="gcomm://1.1.1.1,1.1.1.2,1.1.1.3"
wsrep_cluster_name='galera_cluster'

* t& v: n1 l, B. W  j/ R! n
# Galera Node Configuration
wsrep_node_address='1.1.1.1'
wsrep_node_name='db1'

* c! |7 P+ P7 J
# Galera Synchronization Configuration
wsrep_sst_method=xtrabackup
wsrep_sst_auth=sst_user:dbpass

% l3 X4 x# v* M. G4 D6 k; ~' r
对于第二、三个节点,不要忘了修改地址:
wsrep_node_address=1.1.1.2
wsrep_node_name='db2'
# a, K  K" R+ J! R/ y; l
2.2.6 初始化第一个节点
]# /etc/init.d/mysql start --wsrep-new-cluster
, i9 R5 X0 Y) o5 f; v% h3 q
检查集群状态
]# mysql-uroot-p-e"show status like 'wsrep%'"
|wsrep_local_state_comment | Synced <-- cluster is synced
|wsrep_incoming_addresses  | 1.1.1.1:3306 <-- node db1 is a provider
|wsrep_cluster_size        | 1 <-- cluster consists of 1 node
|wsrep_ready               | ON <-- good :)
& v  R2 \* N( j4 U* {
2.2.7 启动第二个节点
]# service mysql start
]# mysql -u root -p -e "show status like 'wsrep%'"
| wsrep_local_state_comment | Synced                    |
| wsrep_incoming_addre sses | 1.1.1.1:3306,1.1.1.2:3306 |
| wsrep_cluster_size        | 2                         |
| wsrep_connected           | ON                        |
| wsrep_ready               | ON                        |

# [4 G" |  E3 V! [3 C
2.2.8 启动第三个节点
| wsrep_local_state_comment | Synced                                 |
| wsrep_incoming_addresses  | 1.1.1.3:3306,1.1.1.1:3306,1.1.1.2:3306 |
| wsrep_cluster_size        | 3                                      |
| wsrep_connected           | ON                                     |
| wsrep_ready               | ON                                     |
! I. k  ^! p  v  J. h4 @
2.2.9 检验集群同步是否成功,在第一个节点执行:
]# mysql -u root -p -e 'CREATE DATABASE clustertest;'
]# mysql -u root -p -e 'CREATE TABLE clustertest.mycluster ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(50), ipaddress VARCHAR(20), PRIMARY KEY(id));'
]# mysql -u root -p -e 'INSERT INTO clustertest.mycluster (name, ipaddress) VALUES ("db1", "1.1.1.1");'

/ n) {6 V/ r$ f! h/ j
分别在3个节点上都执行以下查询:
]# mysql -u root -p -e 'SELECT * FROM clustertest.mycluster;'
Enter password:
+----+------+-----------+
| id | name | ipaddress |
+----+------+-----------+
| 2  | db1  | 1.1.1.1   |
+----+------+-----------+
如果3个节点都能看到同样的结果,说明集群同步没有问题。
9 T/ B$ c  H7 I2 |8 n3 h
2.2.10 重新启动第一个节点,再次加入集群
]# service mysql stop
]# service mysql start
注意:除了第一次初始化启动集群外,绝对不要再次执行“--wsrep-new-cluster”,第一次初始化的时候也不能在多个节点上执行!!!切记!
7 ?2 E+ Z, F; \: A  R/ U6 U) a
三、Galera与haproxy
    在实际应用中,Galera集群常与haproxy配合,haproxy作为单一入口,将SQL流量分配到后端Galera,注意此处是TCP级别的,而不是SQL语句级别。如果需要SQL语句级别的,可以参考看看MaxScale。相比haproxy方案,各有应用,此处不展开。
    实际应用的结构通常如下图所示,haproxy作为Galera Cluster的前端,2台haproxy用keepalived避免单点故障。后端的Galera集群可以是3个节点,也可以是2个节点+1个仲裁节点。
    在我公司的实际使用中,我们采用了2个节点+1个仲裁节点的方式。另外,为了避免Galera写入冲突,在haproxy配置中,实际上只允许一个节点接受写入,另一个节点带有backup参数,只有当前允许写入的节点坏掉,才会自动写入另一个节点。为了充分利用另一个节点,同时做读写分离,在haproxy上监听两个端口,例如:3307用于写入,3308用于读取。

8 R% n# P5 ?" M                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" action-data="http%3A%2F%2Fs2.sinaimg.cn%2Fmw690%2F0023u9s8zy79wdKHYYN11%26690" action-type="show-slide" style="border-width: 0px; border-style: initial; list-style: none;">
  a: O7 r: N: _* E7 i

* b# m2 j0 K; F) p  N8 T: I
盗一个别人的图来说明大概意思,这个图本身是说明haproxy配合主从复制的,但我们所用的读写分离意思是一样的。
4 H9 S. F8 Q. \4 Q" S+ H
% d1 u( m$ B' @0 r1 j, [" x( ?
                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" action-data="http%3A%2F%2Fs14.sinaimg.cn%2Fmw690%2F0023u9s8zy79wiMuXSd5d%26690" action-type="show-slide" style="border-width: 0px; border-style: initial; list-style: none;">
: ~  t: Z& Q" `3 u9 Q4 ]5 q4 h9 t' H
$ d6 B: @2 J- H
3.1 galera的backend check
    使用haproxy,普通的tcp 3306端口的check不足以保证后端的数据库可用,因为Galera的集群状态有多种。因此必须仔细规划后段Galera状态检查,可以参考下图。
- C  g; L- G* G1 F( @
                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" action-data="http%3A%2F%2Fs2.sinaimg.cn%2Fmw690%2F0023u9s8zy79wfhgrfz61%26690" action-type="show-slide" style="border: 0px; list-style: none;">4 l! ?' j, {0 ~, P2 h
percona已经根据上图做好了后端检查的clustercheck脚本,地址为:https://github.com/olafz/percona-clustercheck

$ \; m; c, z3 q
3.1.1  从github下载clustercheck脚本到各节点的/usr/bin
3.1.2  编辑xinetd配置文件
]# vi /etc/xinetd.d/mysqlchk:

6 h5 o1 O3 ~' J
# default: on

$ ], ?, ^/ E7 P! M! O
# description: mysqlchk
: q6 Z) X8 E+ G% l7 g) Y
service mysqlchk

& h* l$ M, J. t3 g  H% D) ?9 X
{

& \# Q2 o3 f. P" r" @# v1 z
        disable = no
8 T, ^8 V" z' g9 ^' y
        flags = REUSE

* x& ^0 g+ s, r) _" N
        socket_type = stream

; x8 x1 Q( W* c1 W* T6 x
        port = 9200
# P) _' B' q  f
        wait = no

9 L( w/ A8 O) W9 C# f3 G
        user = nobody

) h1 b$ s4 g* F$ u5 Y! @1 N5 c
        server = /usr/bin/clustercheck

& g- N+ X9 A) N& d; S
        log_on_failure += USERID
, u  |: E8 T) k  ]
        only_from = 0.0.0.0/0

  u0 e2 X' u! u
        per_source = UNLIMITED

  M6 w3 y: z- U, X
}

2 t) o2 w% g) M7 ]9 J' b
3.1.3  编辑/etc/services
# echo 'mysqlchk      9200/tcp    # MySQL check' >> /etc/services
3.1.4  重启xinetd
# /etc/init.d/xinetd restart
3.1.5  创建用于执行check的数据库用户,只需要在一个节点操作就好,Galera会自动同步到其他节点。
mysql> GRANT PROCESS ON *.* TO 'clustercheckuser'@'localhost' IDENTIFIED BY 'clustercheckpassword!'
注意:用户名和密码要与clustercheck脚本中的参数一致。
3.1.6  配置haproxy
8 N' F' J  C, W, M, M7 H
...
( E7 @5 U4 {; `, t( {+ u  Q/ z8 i
listen percona-cluster 0.0.0.0:3307
$ L: `% u! u& D3 E
  balance leastconn

" A* j& u8 T/ \& p$ v
  option httpchk

! g3 h; g( ]2 s3 c1 V9 |7 I7 x; D
  mode tcp

# ~$ l( @2 X7 [9 A! ]
    server node1 1.1.1.1:3306 check port 9200 inter 5000 fastinter 2000 rise 2 fall 2
! h" N0 s. f- |# \1 b' q7 I0 T
    server node2 1.1.1.2:3306 check port 9200 inter 5000 fastinter 2000 rise 2 fall 2
8 v1 l4 ]( H" k; U
    server node3 1.1.1.3:3306 check port 9200 inter 5000 fastinter 2000 rise 2 fall 2 backup

! u7 T6 g" r) ^! r  T$ x
& T4 j! M2 r( L3 j  G, v4 i
haproxy做backend check的时候,如果后端节点正常,则会返回HTTP code 200 (OK), 否则返回HTTP error 503 (Service Unavailable) ,这样haproxy会自动加载或下线节点。
* X% G7 f) r* d' g& ^
四、仲裁节点
    为了避免“脑裂”,Galera集群最少需要3个节点,生产环境中最好是3台独立主机,或者位于3个不同IDC的主机。如果觉得3台主机太浪费,也可以2台数据库节点+1个虚拟机仲裁节点。
[size=#]    仲裁节点是集群的一部分,可以参与投票,但是不参与实际复制。在3个IDC场景下,如果一个IDC自身网络中断,但假如它与仲裁节点可以连通,同时其他节点也与仲裁节点可以连通的话,那仲裁节点就会作为中间人连接另两个节点通信。
    尽管仲裁节点不存储数据,但它必须可以看到所有的流量的传输复制。如果仲裁节点放在一个网络环境较差的地方,那它连接到集群的时候,可能会导致集群性能下降。
   
% _4 k9 z% D+ ?* ]5 [; U$ M% n4 t! x# p
                               
登录/注册后可看大图
Cluster配置说明" title="MySQL的Galera Cluster配置说明" style="border-width: 0px; border-style: initial; list-style: none;">
使用YUM安装的MariaDB带有Galera Arbitrator,在配置文件中写入前边配好的集群节点地址和端口,集群名字,启动grab即可。
]# vi /etc/sysconfig/garb

$ g. h2 l3 E& U5 L) x
  H1 B& m/ {8 r! z! d
# Copyright (C) 2012 Codership Oy
0 a" Y6 p4 B8 N& v8 m

7 X7 a2 `7 L# t: o8 _
# This config file is to be sourced by garb service script.
$ h& ]& v' ~0 j
. @& c! Q) X4 {9 n3 e
( f* r$ z9 `6 a! B

& t8 s! k, ]8 O- J9 O' _0 ?8 @1 K. R1 |% E) M1 B2 M# N- _
# A comma-separated list of node addresses (address[:port]) in the cluster

$ X" o3 S/ [) b, M, w5 V  O. U3 M2 T8 f
GALERA_NODES="1.1.1.1:4567, 1.1.1.2:4567, 1.1.1.3:4567"
$ X6 H/ ^+ d, C2 N8 C- @3 ^

5 X% [6 ~* N7 s( s% d9 Y% a8 a: A
& T, \+ M; b+ X! n/ D
7 H: a% X' W5 Y/ ]. p
# Galera cluster name, should be the same as on the rest of the nodes.

+ n2 t# `  k& _$ _5 Q. g; j( j% @- A4 _
GALERA_GROUP="galera_cluster"
! C2 A6 Q( |+ M) w$ x/ F* t
, K# O3 J8 d0 j3 w

2 q  o4 ?: t6 Y
1 t, Y3 M$ ]$ U! ?/ t6 }/ D
( {% j  D) T* ^: b7 A6 k' A
# Optional Galera internal options string (e.g. SSL settings)

! D# h, d* X3 z$ N% v9 L* N) k* s  a/ N  L! [% q  W2 \; E; e
# see http://galeracluster.com/documen ... leraparameters.html
1 h; o7 ~) y# k6 b- B, X$ u
: f( Y6 \4 [& A! O, q0 P" W
# GALERA_OPTIONS=""
  `, E8 J" @' D# o. h
. C5 o7 b) K! C$ M0 w' n2 u

/ r7 ~* }( |1 C" i' j9 ]3 Q  z
( b0 s% S: t( c4 J7 }% v- F1 ^  X/ k! Q. j) r/ Z2 z
# Log file for garbd. Optional, by default logs to syslog

9 K/ }6 @" J' f& h; F; ]8 O( o
) E3 s* z( t& @4 [. S6 R/ t7 q
# Deprecated for CentOS7, use journalctl to query the log for garbd
7 _# @  U- d: e% |5 n
1 T) ?7 j: J7 h9 i6 U
# LOG_FILE=""

; o2 z4 ?5 Q* n( p2 q/ L/ w4 D0 u4 o& K

0 Y& E( I# c( |6 ?2 P2 K3 g7 a. U
]# service garb start
[ ok ] Starting /usr/bin/garbd: :.

, a' }7 Y7 c) x& }% K+ U1 _
]# service garb status
[ ok ] garb is running.
0 z" \) }; @$ R" w9 G( M* n
]# mysql -u root -p -e "SHOW STATUS LIKE 'wsrep_cluster_size'"
检查集群节点数量,会发现增加了1个节点。
! a+ C, R- b- a; B/ I' `
补充下关于如何测试Galera集群的脑裂(两个节点的集群)
1.断开两个节点的网络连接,quorum丢失,所有节点不再接受请求
2.将网络连接恢复,quorum仍然丢失,所有节点仍旧不接受请求。
3.登录其中一个节点,reset quorum:
SET GLOBAL wsrep_provider_options='pc.bootstrap=1';
4.quorum被重置,集群恢复

0 Y8 K2 p6 o. ?* I$ W. f. ~2 l, v8 z( @) o, p' o5 r: }
2 q! A8 i- Q  _0 @% C- i

; h. o: J; D+ h% Q  }/ J$ {# W+ t  x. s) T

0 j& P9 n+ o" Y9 U6 s' x' O. J$ x$ z! i! V1 H8 E8 v
 楼主| 发表于 2017-9-7 10:26:38 | 显示全部楼层
show global variables like 'expire_logs_days'
5 D5 ~% p6 X( h% c    -> ;
2 s3 ?! Z: n- E+------------------+-------+3 w- W! l1 \% M& P& @5 y; R
| Variable_name    | Value |
# T) _' x  _/ @8 W& u+------------------+-------+9 {4 O5 ^$ ?6 ~4 _) V; e1 z
| expire_logs_days | 10    |; _5 s" K$ L6 t1 }% E
+------------------+-------+  H3 P( Z7 L  D6 M+ e
1 row in set (0.00 sec)
2 p9 M( w2 F7 Q4 s
 楼主| 发表于 2020-2-20 14:37:25 | 显示全部楼层
show global variables like 'expire_logs_days';' h5 k5 R: g+ u$ }, B! [
+------------------+-------+
9 i$ C7 g/ X0 L. @# g| Variable_name    | Value |
9 i  s) o6 l: L+------------------+-------+
3 e) ]; F, s" I6 o4 C0 ^| expire_logs_days | 0     |8 K" Z/ V; d  q/ l, H
3 k8 R8 g& x4 Q, |
修改bin.log日志清理日期:" ]5 g* f$ {9 l
set global expire_logs_days=3;" l2 c% v) ?5 `$ C$ d. ~" J9 K

: v0 |, x0 A+ @) H" nmysql>  show global variables like 'expire_logs_days';
1 B! f4 m" j' \& V; M, T9 q! `+------------------+-------+( J9 u5 o' q9 K9 Q
| Variable_name    | Value |9 o4 _' G* V) ~8 \( C. Q
+------------------+-------+* R5 @: p  I  S( {, I. t8 {9 F
| expire_logs_days | 3     |
; K& Z8 U9 j1 [: t# C6 L+------------------+-------+/ \, ]0 k# ?9 ?
1 row in set (0.00 sec)
" ]- k2 d# W# X2 H+------------------+-------+
5 n+ {' z2 l7 X3 e1 row in set (0.01 sec)
您需要登录后才可以回帖 登录 | 开始注册

本版积分规则

关闭

站长推荐上一条 /4 下一条

北京云银创陇科技有限公司以云计算运维,代码开发

QQ|返回首页|Archiver|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )点击这里给我发消息

GMT+8, 2026-4-8 21:28 , Processed in 0.066749 second(s), 21 queries .

Powered by Discuz! X3.4 Licensed

© 2012-2025 Discuz! Team.

快速回复 返回顶部 返回列表