首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 源碼編譯安裝與 UDF 實現 Memcached 數據自動同步實戰

     編輯:MySQL 資料庫相關知識

本文分為兩大部分:第一部分詳細記錄 CentOS 環境下 MySQL 5.5 源碼編譯安裝的完整流程(依賴安裝、CMake 配置、目錄佈局、權限設定、服務註冊);第二部分介紹如何透過 UDF(用戶定義函數)結合 Trigger(觸發器),實現 MySQL 與 Memcached 的雙向自動同步,降低應用層快取維護複雜度。

第一部分:MySQL 5.5 源碼編譯安裝

1. 系統依賴安裝

yum install -y gcc gcc-c++ ncurses-devel perl

2. 安裝 CMake 2.8.12

wget https://www.cmake.org/files/v2.8/cmake-2.8.12.tar.gz
tar zxvf cmake-2.8.12.tar.gz && cd cmake-2.8.12
./bootstrap && make && make install

3. 安裝 Bison 3.0.2

wget https://ftp.gnu.org/gnu/bison/bison-3.0.2.tar.gz
tar zxvf bison-3.0.2.tar.gz && cd bison-3.0.2
./configure && make && make install

4. 建立用戶與目錄結構

groupadd mysql && useradd -g mysql -r -s /sbin/nologin mysql
mkdir -p /data/mysql/{data,log}
chown -R mysql:mysql /data/mysql

5. 下載並編譯 MySQL 5.5.24

wget https://downloads.mysql.com/archives/mysql-5.5/mysql-5.5.24.tar.gz
tar zxvf mysql-5.5.24.tar.gz && cd mysql-5.5.24

cmake \
-DCMAKE_INSTALL_PREFIX=/data/mysql \
-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock \
-DDEFAULT_CHARSET=utf8 \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_ARCHIVE_STORAGE_ENGINE=1 \
-DWITH_BLACKHOLE_STORAGE_ENGINE=1 \
-DMYSQL_DATADIR=/data/mysql/data \
-DMYSQL_TCP_PORT=3306 \
-DENABLE_DOWNLOADS=1

make && make install

6. 權限修正與庫文件鏈接

chmod +w /data/mysql
chown -R mysql:mysql /data/mysql
ln -s /data/mysql/lib/libmysqlclient.so.18 /usr/lib/libmysqlclient.so.18
ln -s /data/mysql/mysql.sock /tmp/mysql.sock

7. 初始化資料庫與服務註冊

cp support-files/my-medium.cnf /etc/my.cnf
cp support-files/mysql.server /etc/rc.d/init.d/mysqld
/data/mysql/scripts/mysql_install_db --user=mysql --defaults-file=/etc/my.cnf --basedir=/data/mysql --datadir=/data/mysql/data

chmod +x /etc/init.d/mysqld
# 編輯 /etc/init.d/mysqld 確認 basedir/datadir 路徑
chkconfig --add mysqld
service mysqld start

8. 完成配置

/data/mysql/bin/mysqladmin -uroot -p password '強密碼'
echo "export PATH=/data/mysql/bin:\$PATH" >> ~/.bash_profile
source ~/.bash_profile

第二部分:UDF + Trigger 實現 MySQL ↔ Memcached 自動同步

核心原理

  • UDF (User Defined Functions):MySQL 5.0+ 支援,允許 SQL 直接呼叫 C/C++ 函數操作 Memcached
  • Trigger:MySQL 5.1+ 支援,在 INSERT/UPDATE/DELETE 時自動觸發 UDF 同步快取
  • 此架構將快取維護邏輯下沉至資料庫層,應用層無感知,大幅降低複雜度

1. 依賴庫安裝

# libmemcached
wget https://launchpad.net/libmemcached/1.0/0.34/+download/libmemcached-0.34.tar.gz
yum install -y gcc44 gcc44-c++ libstdc++44-devel
export CC=/usr/bin/gcc44 && export CXX=/usr/bin/g++44
./configure --prefix=/soft/libmemcached --disable-64bit CFLAGS="-O3 -march=i686" --with-memcached=/root/libmemcached-1.0.7/memcached
make && make install

# memcached_functions_mysql (UDF)
wget https://launchpad.net/memcached-udfs/trunk/1.1/+download/memcached_functions_mysql-1.1.tar.gz
./configure --prefix=/soft/UDFS/memcache_mysql \
--with-mysql=/soft/mysql/bin/mysql_config \
--libdir=/soft/mysql/lib/plugin \
--with-libmemcached=/soft/UDFS/libmemcached
make && make install

2. 註冊 UDF 函數至 MySQL

mysql -uroot -pmysql < /sql/install_functions.sql
mysql -uroot -pmysql -se "SELECT name, dl FROM mysql.func"

3. 設定 Memcached 連線與行為參數

SELECT memc_servers_set('127.0.0.1:11211');  -- MySQL 重啟後需重新執行
SELECT memc_server_count();
SELECT memc_set('urls:sequence', 0);

-- 優化連線行為:非阻塞 + TCP_NODELAY
SELECT memc_servers_behavior_set('MEMCACHED_BEHAVIOR_NO_BLOCK', '1');
SELECT memc_servers_behavior_set('MEMCACHED_BEHAVIOR_TCP_NODELAY', '1');

關鍵說明:啟用 NO_BLOCK 後,Memcached 故障時 MySQL 不會阻塞等待 timeout,直接寫入資料庫並記錄錯誤,保證核心業務可用性。

4. 建立測試表與觸發器

DROP TABLE IF EXISTS urls;
CREATE TABLE urls (
    id INT(3) NOT NULL AUTO_INCREMENT,
    url VARCHAR(64) NOT NULL DEFAULT '',
    PRIMARY KEY (id)
);

DELIMITER |

-- INSERT 觸發器:分配自增 ID 並同步寫入快取
DROP TRIGGER IF EXISTS url_mem_insert |
CREATE TRIGGER url_mem_insert BEFORE INSERT ON urls
FOR EACH ROW BEGIN
    SET NEW.id = memc_increment('urls:sequence');
    SET @mm = memc_set(NEW.id, NEW.url);
END |

-- UPDATE 觸發器:更新快取
DROP TRIGGER IF EXISTS url_mem_update |
CREATE TRIGGER url_mem_update BEFORE UPDATE ON urls
FOR EACH ROW BEGIN
    SET @mm = memc_replace(OLD.id, NEW.url);
END |

-- DELETE 觸發器:刪除快取
DROP TRIGGER IF EXISTS url_mem_delete |
CREATE TRIGGER url_mem_delete BEFORE DELETE ON urls
FOR EACH ROW BEGIN
    SET @mm = memc_delete(OLD.id);
END |

DELIMITER ;

5. 驗證同步效果

-- 插入測試
INSERT INTO urls (url) VALUES ('https://google.com'), ('https://lycos.com/'), ('https://tripod.com/');
SELECT * FROM urls;
SELECT memc_get('urls:1'), memc_get('urls:2'), memc_get('urls:3');

-- 更新測試
UPDATE urls SET url = 'https://mysql.com/sun' WHERE url = 'https://mysql.com';
SELECT memc_get('urls:6');

-- 刪除測試
DELETE FROM urls WHERE url = 'https://microsoft.com/';
SELECT memc_get('urls:4');  -- 應返回 NULL

6. 生產環境注意事項

  • UDF 函數庫需放置在 MySQL plugin_dir 目錄(SHOW VARIABLES LIKE 'plugin_dir')
  • Memcached 叢集需配置一致性哈希,UDF 端設定多台 Server
  • 監控 memc_server_count() 確保連線正常
  • 大寫入場景考慮非同步寫入或批次同步,避免阻塞主庫
  • 定期對比資料庫與快取數據一致性,建立修復機制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved