瞭解Arch Linux Arch Linux是一個輕量、靈活、基於x86-64架構的Linux發行版,遵循K.I.S.S.原則。註重代碼正確、優雅和極簡主義,期待用戶能夠願意去理解系統的操作。 1.簡潔 Arch Linux將簡潔定義為:避免任何不必要的添加、修改和複雜增加。簡單來說,archli ...
瞭解Arch Linux
Arch Linux是一個輕量、靈活、基於x86-64架構的Linux發行版,遵循K.I.S.S.原則。註重代碼正確、優雅和極簡主義,期待用戶能夠願意去理解系統的操作。
1.簡潔
Arch Linux將簡潔定義為:避免任何不必要的添加、修改和複雜增加。簡單來說,archlinux 是一個可以讓用戶自己動手打造的操作系統。從安裝到管理,archlinux 放手讓用戶處理一切。
用戶可以自己決定使用哪種桌面環境、安裝哪些組件和服務。這種精細化的控制能夠賦予你一個精簡的操作系統,可以讓用戶自由選擇所需的組件來構建屬於用戶自己的系統。
2.滾動更新(現代)
滾動更新(rolling update)是指軟體開發中經常性將更新發送到軟體的概念。相較於滾動發行,有標準版本和小數點版本的版本號開發模式,必需通過重新安裝以取代先前的發行版。Arch Linux 是沒有版本概念的,它始終保持最新的狀態,通俗的理解就相當於把發行版比喻為一部車,ubuntu 更新就是換一部新的,而 Arch Linux就是把車裡面舊的配件換成新的。
Arch Linux是一個滾動發行版,這意味著:
- 新的內核和應用程式版本一經發佈,就會立即向用戶推送
- 當大多數其它 Linux 發行版還在提供舊的 Linux 內核版本時,Arch Linux會迅速向用戶提供最新的內核
- 而軟體也是如此。如果 Arch Linux倉庫中的軟體發佈了新版本,Arch Linux用戶通常會比其他用戶先獲得新版本
- 在滾動發行模式下,一切都是新鮮和前沿的。用戶不必把操作系統從一個版本升級到另一個版本,只要使用
pacman
的升級命令,便會始終保持最新的版本
3.實用
Arch Linux註重實用性,避免意識形態之爭。最終的設計決策都是由開發者的共識決定。開發者依賴基於事實的技術分析和討論,避免政治因素,不會被流行觀點左右。
Arch Linux的倉庫中包含大量的軟體包和編譯腳本。用戶可以按照需要自由選擇。倉庫中既提供了開源、自由的軟體,也提供了閉源軟體(大部分閉源軟體在 AUR
倉庫中)。實用性大於意識形態。
4.激進的內核更新機制
Arch Linux在更新內核的時候會立即刪除舊內核(因為內核也是一個軟體包 linux
/ linux-zen
...,由 pacman
更新)
立即刪除舊的內核要求 Arch Linux必須重啟來載入新的內核,否則容易發生詭異的問題。這是因為 Linux 所謂的“內核”包含有大量的動態載入模塊,如果在某次啟動後,某個模塊沒有被載入過,然後系統內核更新了並且刪除了舊的內核,那麼這些模塊將永遠不能被載入了——因為它們隨著舊內核被刪掉了。除非用戶重啟系統以完整切換到新的內核以使用新版的動態載入模塊。
5.軟體包管理體系
不同於 Debian 系列的 apt / dpkg
和 Red Hat 系列的 dnf(yum)/ rpm
包管理體系,Arch Linux只用了一個工具 pacman 就解決了獲取和安裝兩個功能。這降低了為 Arch Linux 製作軟體包的門檻,這也是 AUR 幾乎能涵蓋整個 Linux 軟體生態的主要原因。但是這也導致 pacman 不支持虛包(virtual package)。
更多介紹前往Arch Linux社區網站:https://www.archlinuxcn.org/
安裝Arch Linux
安裝Arch Linux的過程這裡就不再詳細介紹了,可以前往Arch Linux的官方文檔查看詳細的安裝流程:https://arch-linux.osrc.com/rookie/pre-install.html
下麵,我將展示成功安裝完成的Arch Linux環境
$ uname -a
Linux myarch 6.6.3-arch1-1 #1 SMP PREEMPT_DYNAMIC Wed, 29 Nov 2023 00:37:40 +0000 x86_64 GNU/Linux
$ neofetch
root@myarch
-----------
OS: Arch Linux x86_64
Host: Latitude 5491
Kernel: 6.6.3-arch1-1
Uptime: 17 hours, 39 mins
Packages: 187 (pacman)
Shell: bash 5.2.21
Resolution: 1920x1080
Terminal: /dev/pts/0
CPU: Intel i7-8850H (12) @ 4.300GHz
GPU: Intel CoffeeLake-H GT2 [UHD Graphics 630]
Memory: 239MiB / 15787MiB
$ lcc -version
ldd (GNU libc) 2.38
安裝GreatSQL
什麼是GreatSQL
GreatSQL是適用於金融級應用的國內自主開源資料庫,具備高性能、高可靠、高易用性、高安全等多個核心特性,可以作為MySQL或Percona Server的可選替換,用於線上生產環境,且完全免費並相容MySQL或Percona Server。
GreatSQL具備高性能、高可靠、高易用性、高安全等多個核心特性。
選擇GreatSQL安裝包
因為Arch Linux系統自帶的ldd (GNU libc)版本是2.38,所以這裡下載的GreatSQL二進位包選擇
- GreatSQL-8.0.32-24-Linux-glibc2.28-x86_64.tar.xz
Arch Linux系統缺少wget所以我們需要先安裝wget
$ pacman -S wget
將二進位安裝包下載在/usr/local
目錄下,並解壓
$ cd /usr/local
$ wget https://product.greatdb.com/GreatSQL-8.0.32-24/GreatSQL-8.0.32-24-Linux-glibc2.28-x86_64.tar.xz
# 解壓
$ tar xf GreatSQL-8.0.32-24-Linux-glibc2.28-x86_64.tar.xz
運行環境配置
因為Arch Linux系統主打極簡風,所以selinux和防火牆都沒有,我們都不需要手動關閉了:)
安裝依賴包
Arch Linux用了一個工具 pacman 作為下載軟體包
進入到GreatSQL-8.0.32-24-Linux-glibc2.28-x86_64/bin
目錄,輸入命令ldd mysqld mysql | grep "not found"
若不顯示其它信息則已經不缺必要軟體包
這裡我缺失了兩個依賴包
libaio.so.1 => not found
libnuma.so.1 => not found
使用pacman安裝libaio和numactl
$ pacman -S libaio
$ pacman -S numactl
最後檢查下若不顯示其它信息則已經不缺必要軟體包
$ ldd mysqld mysql | grep "not found"
創建配置文件及新建用戶與目錄
可根據實際情況修改,一般主要涉及資料庫文件分區、目錄,記憶體配置等少數幾個選項。以下麵這份為例
註意,若記憶體不夠充足請調低
innodb_buffer_pool_size
$ vi /etc/my.cnf
[client]
socket = /data/GreatSQL/mysql.sock
[mysqld]
user = mysql
port = 3306
#主從複製或MGR集群中,server_id記得要不同
#另外,實例啟動時會生成 auto.cnf,裡面的 server_uuid 值也要不同
#server_uuid的值還可以自己手動指定,只要符合uuid的格式標準就可以
server_id = 3306
basedir = /usr/local/GreatSQL-8.0.32-24-Linux-glibc2.28-x86_64
datadir = /data/GreatSQL
socket = /data/GreatSQL/mysql.sock
pid-file = mysql.pid
character-set-server = UTF8MB4
skip_name_resolve = 1
#若你的MySQL資料庫主要運行在境外,請務必根據實際情況調整本參數
default_time_zone = "+8:00"
#performance setttings
lock_wait_timeout = 3600
open_files_limit = 65535
back_log = 1024
max_connections = 512
max_connect_errors = 1000000
table_open_cache = 1024
table_definition_cache = 1024
thread_stack = 512K
sort_buffer_size = 4M
join_buffer_size = 4M
read_buffer_size = 8M
read_rnd_buffer_size = 4M
bulk_insert_buffer_size = 64M
thread_cache_size = 768
interactive_timeout = 600
wait_timeout = 600
tmp_table_size = 32M
max_heap_table_size = 32M
max_allowed_packet = 64M
net_buffer_shrink_interval = 180
#GIPK
loose-sql_generate_invisible_primary_key = ON
#log settings
log_timestamps = SYSTEM
log_error = error.log
log_error_verbosity = 3
slow_query_log = 1
log_slow_extra = 1
slow_query_log_file = slow.log
#設置slow log文件大小1G及總文件數10
max_slowlog_size = 1073741824
max_slowlog_files = 10
long_query_time = 0.1
log_queries_not_using_indexes = 1
log_throttle_queries_not_using_indexes = 60
min_examined_row_limit = 100
log_slow_admin_statements = 1
log_slow_slave_statements = 1
log_bin = binlog
binlog_format = ROW
sync_binlog = 1
binlog_cache_size = 4M
max_binlog_cache_size = 2G
max_binlog_size = 1G
#控制binlog總大小,避免磁碟空間被撐爆
binlog_space_limit = 500G
binlog_rows_query_log_events = 1
binlog_expire_logs_seconds = 604800
#MySQL 8.0.22前,想啟用MGR的話,需要設置binlog_checksum=NONE才行
binlog_checksum = CRC32
gtid_mode = ON
enforce_gtid_consistency = TRUE
#myisam settings
key_buffer_size = 32M
myisam_sort_buffer_size = 128M
#replication settings
relay_log_recovery = 1
slave_parallel_type = LOGICAL_CLOCK
#可以設置為邏輯CPU數量的2倍
slave_parallel_workers = 64
binlog_transaction_dependency_tracking = WRITESET
slave_preserve_commit_order = 1
slave_checkpoint_period = 2
#innodb settings
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 8
innodb_data_file_path = ibdata1:12M:autoextend
innodb_flush_log_at_trx_commit = 1
innodb_log_buffer_size = 32M
innodb_log_file_size = 2G
innodb_log_files_in_group = 3
innodb_redo_log_capacity = 6G
innodb_max_undo_log_size = 4G
# 根據您的伺服器IOPS能力適當調整
# 一般配普通SSD盤的話,可以調整到 10000 - 20000
# 配置高端PCIe SSD卡的話,則可以調整的更高,比如 50000 - 80000
innodb_io_capacity = 4000
innodb_io_capacity_max = 8000
innodb_open_files = 65535
innodb_flush_method = O_DIRECT
innodb_lru_scan_depth = 4000
innodb_lock_wait_timeout = 10
innodb_rollback_on_timeout = 1
innodb_print_all_deadlocks = 1
innodb_online_alter_log_max_size = 4G
innodb_print_ddl_logs = 0
innodb_status_file = 1
#註意: 開啟 innodb_status_output & innodb_status_output_locks 後, 可能會導致log_error文件增長較快
innodb_status_output = 0
innodb_status_output_locks = 1
innodb_sort_buffer_size = 67108864
innodb_adaptive_hash_index = 0
#開啟NUMA支持
innodb_numa_interleave = ON
innodb_print_lock_wait_timeout_info = 1
#自動殺掉超過5分鐘不活躍事務,避免行鎖被長時間持有
kill_idle_transaction = 300
#innodb parallel query
loose-force_parallel_execute = OFF
loose-parallel_default_dop = 8
loose-parallel_max_threads = 96
temptable_max_ram = 8G
#pfs settings
performance_schema = 1
#performance_schema_instrument = '%memory%=on'
performance_schema_instrument = '%lock%=on'
接下來新建mysql用戶和新建資料庫主目錄,並修改許可權模式及屬主
$ /sbin/groupadd mysql
$ /sbin/useradd -g mysql mysql -d /dev/null -s /sbin/nologin
$ mkdir -p /data/GreatSQL
$ chown -R mysql:mysql /data/GreatSQL
$ chmod -R 700 /data/GreatSQL
如果是在一個全新環境中首次啟動GreatSQL資料庫,可能會失敗,因為在 mysqld_pre_systemd
的初始化處理邏輯中,需要依賴 /var/lib/mysql-files
目錄保存一個臨時文件
所以我們手動創建/var/lib/mysql-files
目錄
$ mkdir -p /var/lib/mysql-files && chown -R mysql:mysql /var/lib/mysql-files
增加GreatSQL系統服務
$ vim /lib/systemd/system/greatsql.service
[Unit]
Description=GreatSQL Server
Documentation=man:mysqld(8)
Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
[Service]
# some limits
# file size
LimitFSIZE=infinity
# cpu time
LimitCPU=infinity
# virtual memory size
LimitAS=infinity
# open files
LimitNOFILE=65535
# processes/threads
LimitNPROC=65535
# locked memory
LimitMEMLOCK=infinity
# total threads (user+kernel)
TasksMax=infinity
TasksAccounting=false
User=mysql
Group=mysql
#如果是GreatSQL 5.7版本,此處需要改成simple模式,否則可能服務啟用異常
#如果是GreatSQL 8.0版本則可以使用notify模式
#Type=simple
Type=notify
TimeoutSec=0
PermissionsStartOnly=true
ExecStartPre=/usr/local/GreatSQL-8.0.32-24-Linux-glibc2.28-x86_64/bin/mysqld_pre_systemd
ExecStart=/usr/local/GreatSQL-8.0.32-24-Linux-glibc2.28-x86_64/bin/mysqld $MYSQLD_OPTS
EnvironmentFile=-/etc/sysconfig/mysql
Restart=on-failure
RestartPreventExitStatus=1
Environment=MYSQLD_PARENT_PID=1
PrivateTmp=false
啟動GreatSQL
把GreatSQL添加進環境變數
$ echo 'export PATH=/usr/local/GreatSQL-8.0.32-24-Linux-glibc2.28-x86_64/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile
執行下麵的命令啟動GreatSQL服務
$ systemctl start greatsql
$ systemctl status greatsql
● greatsql.service - GreatSQL Server
Loaded: loaded (/usr/lib/systemd/system/greatsql.service; disabled; preset: disabled)
Active: active (running) since Fri 2023-12-01 10:30:29 CST; 4s ago
Docs: man:mysqld(8)
http://dev.mysql.com/doc/refman/en/using-systemd.html
Process: 712571 ExecStartPre=/usr/local/GreatSQL-8.0.32-24-Linux-glibc2.28-x86_64/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS)
Main PID: 712708 (mysqld)
Status: "Server is operational"
Memory: 2.5G
CPU: 4.549s
CGroup: /system.slice/greatsql.service
└─712708 /usr/local/GreatSQL-8.0.32-24-Linux-glibc2.28-x86_64/bin/mysqld
Dec 01 10:30:24 myarch systemd[1]: Starting GreatSQL Server...
Dec 01 10:30:28 myarch (mysqld)[712708]: greatsql.service: Referenced but unset environment variable evaluates to an empty string: MYSQLD_OPTS
Dec 01 10:30:29 myarch systemd[1]: Started GreatSQL Server.
在上面進行GreatSQL初始化時,會為 root@localhost 用戶生成一個隨機密碼,記錄在 error.log
日誌文件中,例如下麵這樣:
$ grep -i root /data/GreatSQL/error.log
... A temporary password is generated for root@localhost: ji!pjndiw5sJ
複製該密碼,將用於首次登入GreatSQL所需。
$ mysql -uroot -p
Enter password:
# 進入資料庫後可以看到版本
Server version: 8.0.32-24
首次登入立刻提醒該密碼已過期,需要修改,執行類似下麵的命令修改即可:
greatsql> alter user 'root'@'localhost' identified by 'GreatSQL@2022';
Query OK, 0 rows affected (0.02 sec)
GreatSQL資料庫安裝並初始化完畢
安裝MySQL Shell
為了支持仲裁節點特性,需要安裝GreatSQL提供的MySQL Shell發行包。打開GreatSQL下載頁面找到
- greatsql-shell-8.0.25-16-Linux-glibc2.28-x86_64.tar.xz
下載相應的MySQL Shell安裝包(目前只提供二進位安裝包)並解壓
$ cd /usr/local
$ wget https://product.greatdb.com/GreatSQL-8.0.25-16/greatsql-shell-8.0.25-16-Linux-glibc2.28-x86_64.tar.xz
$ tar xf greatsql-shell-8.0.25-16-Linux-glibc2.28-x86_64.tar.xz
進入bin目錄查看下缺少什麼依賴
$ cd /usr/local/greatsql-shell-8.0.25-16-Linux-glibc2.28-x86_64/bin
$ ldd mysqlsh | grep "not found"
libssl.so.1.1 => not found
libcrypto.so.1.1 => not found
libpython3.8.so.1.0 => not found
安裝上缺失的依賴
$ pacman -S core/openssl-1.1
$ pacman -S archlinuxcn/python39
因為下載的Python版本過高,所以採用軟連接的方式
$ ln -s /usr/lib/libpython3.9.so.1.0 /usr/lib64/libpython3.8.so.1.0
再次檢查下還有沒有缺失依賴
$ ldd mysqlsh | grep "not found"
沒有缺失依賴的話,接下來就可以體驗MySQL Shell了
$ /usr/local/greatsql-shell-8.0.25-16-Linux-glibc2.28-x86_64/bin/mysqlsh
MySQL Shell 8.0.25
Copyright (c) 2016, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates.
Other names may be trademarks of their respective owners.
Type '\help' or '\?' for help; '\quit' to exit.
WARNING: Found errors loading plugins, for more details look at the log at: /root/.mysqlsh/mysqlsh.log
MySQL Py >
更多的Shell玩法請移步 圖文結合丨帶你輕鬆玩轉MySQL Shell for GreatSQL https://mp.weixin.qq.com/s/lHTcqFom8QpK2AFtFobdDw
至此,GreatSQL在Arch Linux的成功安裝之旅圓滿結束。現在,您可以盡情感受GreatSQL資料庫帶來體驗
Enjoy GreatSQL