【20180202】使用iptables做MySQL的端口转发
? ? 導讀:將一個實例上面的MySQL請求轉向另外一個MySQL實例上面。
? ? 源服務:172.16.3.6:3306 主庫
? ? 目標服務:172.16.3.7:3306 從庫
? ? 訪問賬戶: test_01@172.16.3.15
? ??新舊實例以及搭建主從
在源服務上面開啟端口轉發服務:
? 2. 在目標服務上面開啟3306服務和創建訪問賬戶:
shell>>?sudo?iptables?-A?INPUT?-s?172.16.3.0/24?-m?state?--state?NEW??-m?tcp?-p?tcp?--dport?3306?-j?ACCEPT shell>>?sudo?service?iptables?save shell>>?sudo?service?iptables?restartmysql>>?grant?select,update,insert,delete?on?*.*?to?'test_01'@'172.16.3.6'?identified?by?'new_password'; mysql>>?flush?privileges; mysql>>?\q? ? 切記:端口轉發設置完畢之后,在172.16.3.15上面使用賬號test_01@172.16.3.15 去連接172.16.3.6,這個時候172.16.3.6的iptables會將請求轉發到172.16.3.7上面的MySQL服務上面,這個時候連接的賬號由test_01@172.16.3.15變成了test_01@172.16.3.6,所以我才會在第二步的時候在172.16.3.7上面創建賬號test_01@172.16.3.6,并且這賬號的密碼必須和賬號test_01@172.16.3.15這個賬號的密碼一致。實際上在目標服務172.16.3.7:3306上面可以不需要創建test_01@172.16.3.15這個賬號,并且在源服務172.16.3.6:3306這個服務在做好端口轉發之后可以關掉這個實例。
? 3.總結
? ? 在整個業務遷移的過程中,存在的情況有如下:
? ? ? a.舊的MySQL實例上面存在多個業務。
? ? ? b.舊的MySQL實例上面存在長連接。
? ? ? c.不同的業務存在針對同一張表的修改操作。
? ? ? d.所有業務的連接使用都是精確匹配,即都是test@ip這種情況。
? ? ? e.binlog_format是statement格式,但是有寫SQL使用了類似與now()的函數,導致主從數據有些table的時間字段數據不一致。
? ? 使用iptables做轉發的目的和缺陷(新舊實例以及搭建主從):
? ? ? 目的:主要是為了在避免不同的業務針對同一張表的修改導致數據不一致。例如:業務A和業務B都可以針對表table_01有修改的權限,并且test_01的主鍵是自增主鍵,業務插入的時候不會顯示的插入主鍵鍵值。當業務A先切換過去的時候,業務B還沒有切換,這個時候業務先插入數據到table_01,然后一段時間之后業務B插入數據到table_01。這個時候就會出現1062主鍵沖突,并且這個時候是以舊的MySQL實例為主還是以新的MySQL實例為主。
? ? ? 缺陷:1.但是假如業務B是長連接的話,在沒有重啟業務B的情況下,業務B還是存在和舊的MySQL實例連接的情況,那么上訴所說的情況還是可能會發生;2.因為所有的業務的賬號都是精確匹配的,所以有在舊的實例上面有些業務的username是一樣的,但是ip可能不一樣,那么它們的權限和賬號也是不一樣的。但是在使用iptables轉發之后,所有的賬號的匹配的ip地址全部變更成了172.16.3.6,所以有些業務它們最后連接到172.16.3.7:3306實例的賬號就是一摸一樣的,但是又有一個問題出現了,就是所有業務的賬號密碼肯定存在不一樣的情況,這個時候它們發起請求的密碼也是不一樣的,但是它們最后連接到172.16.3.7:3306的賬號是一摸一樣,一個賬號只能對應一個賬號密碼信息,那么就會出現所有的業務只有密碼是一樣的才能正常的請求訪問,密碼不一致的請求就會被拒絕掉。
? ? ? 解決方案:重啟新的MySQL實例,重啟的時候加上--skip-grant-tables 。等所有的業務切換之后再次重啟新的MySQL實例。
轉載于:https://blog.51cto.com/11819159/2068149
總結
以上是生活随笔為你收集整理的【20180202】使用iptables做MySQL的端口转发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HTTP RTSP RTMP RTP
- 下一篇: 为什么大部分程序员看不起PHP这门语言?