Cassandra配置JMX

Cassandra數據庫經過JMX方式對外提供監控和管理服務。本文講解如何配置和開啓Cassandra的JMX服務。html

環境說明

本文是基於如下版本的系統和服務:java

  • cassandra 3.11.6
  • openjdk 1.8.0
  • mx4j 3.0.2
  • Ubuntu 18.04.4 LTS

須要說明的是,當使用java 11以服務形式啓動cassandra,服務啓動後會進入 active(exited) 狀態:docker

$ systemctl status cassandra
  ● cassandra.service - LSB: distributed storage system for structured data
     Loaded: loaded (/etc/init.d/cassandra; generated)
       Active: active (exited) since Wed 2020-05-13 13:48:21 CST; 4s ago
       Docs: man:systemd-sysv-generator(8)
    Process: 23280 ExecStop=/etc/init.d/cassandra stop (code=exited, status=0/SUCCESS)
    Process: 23298 ExecStart=/etc/init.d/cassandra start (code=exited, status=0/SUCCESS)

這是由於有參數不支持致使jvm啓動失敗。雖然根據Cassandra 3的文檔,java 1.8及以上版本都支持,但至少java 11並不支持。數據庫

Cassandra目錄和文件

安裝和數據目錄

Cassandra安裝在 /usr/share/cassandra 目錄下。這個目錄的子目錄 /lib下是Cassandar的依賴包,後面安裝配置MX4J服務時,會用到這個目錄。apache

Cassandra的數據文件保存在 /var/lib/cassandra 目錄下。通常能夠經過這個目錄來備份和恢復數據。瀏覽器

日誌文件在 /var/log/cassandra目錄下。這個目錄有三種日誌文件 system.logdebug.loggc.log。多數狀況下,經過查看system.log能夠了解系統的運行狀態和錯誤信息。安全

配置和運行腳本

在Ubuntu上經過Debian Packages方式安裝Cassandra以後,Cassandra能夠以服務方式啓動。接下來的配置也都是基於服務方式操做Cassandra的狀況。服務器

Cassandra沒有提供Systemd服務的配置,因此服務操做仍是經過 /etc/init.d/ 目錄下的 cassandra 腳原本定義的。能夠根據這個腳原本分析Cassandra服務的啓動過程。jvm

根據服務啓動腳本,能夠發現/etc/default/cassandra配置腳本會用來設置運行時所須要的環境變量。好比,若是系統默認的java是不兼容的版本,就能夠在這個腳本中添加JAVA_HOMEJRE_HOME環境變量,好比:socket

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
  export JRE_HOME=/usr/lib/jvm/java-8-openjdk-amd64/jre

注意,若是不是以系統服務的方式啓動Cassandra,則這個配置腳本中設置的環境變量不會生效。

最主要的配置文件和腳本在/etc/cassandra目錄下。這個腳本會根據環境變量等參數動態的計算一些jvm啓動參數。這個目錄下的另一個配置文件jvm.options也能夠用來設置jvm啓動參數,可是cassandra-env.sh腳本設置的優先級比較高,因此要注意確認jvm.options中的設置不會被cassandra-env.sh覆蓋。本文主要使用cassandra-env.sh腳原本設置須要的參數。

配置MX4J HttpAdaptor

Cassandra能夠與MX4J HttpAdaptor集成,經過Web控制檯的方式提供JMX服務訪問。

爲了開啓MX4J HttpAdaptor服務,須要安裝MX4J。MX4J能夠從下載頁面下載須要的版本。下載並解壓後,在mx4j-3.0.2/lib目錄下找到mx4j-tools.jar,將這個jar包安裝到Cassandra的lib目錄/var/lib/cassandra下,而後重啓Cassandra。

若是一切正常,能夠看到system.log中如下日誌內容:

INFO  [main] 2020-05-14 09:29:24,963 Mx4jTool.java:61 - mx4j successfuly loaded

日誌裏的拼寫錯誤是Cassandra的代碼問題,不是我弄錯了。

默認狀況下MX4J HttpAdaptor監聽的是127.0.0.1上的8081端口。若是啓動正常,能夠經過本地瀏覽器訪問Web控制檯了:

8081這個端口頗有可能和其餘服務衝突。當端口衝突時,能夠在system.log中看到如下錯誤信息:

WARN  [main] 2020-05-14 15:52:41,847 Mx4jTool.java:70 - Could not start register mbean in JMX
  java.lang.reflect.InvocationTargetException: null
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_252]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_252]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_252]
        at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_252]
        at org.apache.cassandra.utils.Mx4jTool.maybeLoad(Mx4jTool.java:60) ~[apache-cassandra-3.11.6.jar:3.11.6]
        at org.apache.cassandra.service.CassandraDaemon.setup(CassandraDaemon.java:197) [apache-cassandra-3.11.6.jar:3.11.6]
        at org.apache.cassandra.service.CassandraDaemon.activate(CassandraDaemon.java:630) [apache-cassandra-3.11.6.jar:3.11.6]
        at org.apache.cassandra.service.CassandraDaemon.main(CassandraDaemon.java:757) [apache-cassandra-3.11.6.jar:3.11.6]
  Caused by: java.net.BindException: Address already in use (Bind failed)
        at java.net.PlainSocketImpl.socketBind(Native Method) ~[na:1.8.0_252]
        at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387) ~[na:1.8.0_252]
        at java.net.ServerSocket.bind(ServerSocket.java:390) ~[na:1.8.0_252]
        at java.net.ServerSocket.<init>(ServerSocket.java:252) ~[na:1.8.0_252]
        at mx4j.tools.adaptor.PlainAdaptorServerSocketFactory.createServerSocket(PlainAdaptorServerSocketFactory.java:24) ~[mx4j-tools.jar:na]
        at mx4j.tools.adaptor.http.HttpAdaptor.createServerSocket(HttpAdaptor.java:672) ~[mx4j-tools.jar:na]
        at mx4j.tools.adaptor.http.HttpAdaptor.start(HttpAdaptor.java:478) ~[mx4j-tools.jar:na]
        ... 8 common frames omitted

另外,若是但願從遠程訪問,須要設置監聽地址。此時,能夠在/etc/default/cassandra腳本中將這兩個變量設置爲指望的值,而後重啓Cassandra服務:

export MX4J_ADDRESS="-Dmx4jaddress=0.0.0.0"
  export MX4J_PORT="-Dmx4jport=7081"

設置成功後,能夠在system.log日誌中看到mx4jaddressmx4jport虛擬機參數:

INFO  [main] 2020-05-14 16:04:19,007 CassandraDaemon.java:506 - JVM Arguments: [-Xloggc:/var/log/cassandra/gc.log, -ea, -XX:+UseThreadPriorities, -XX:ThreadPriorityPolicy=42, -XX:+HeapDumpOnOutOfMemoryError, -Xss256k, -XX:StringTableSize=1000003, -XX:+AlwaysPreTouch, -XX:-UseBiasedLocking, -XX:+UseTLAB, -XX:+ResizeTLAB, -XX:+UseNUMA, -XX:+PerfDisableSharedMem, -Djava.net.preferIPv4Stack=true, -XX:+UseParNewGC, -XX:+UseConcMarkSweepGC, -XX:+CMSParallelRemarkEnabled, -XX:SurvivorRatio=8, -XX:MaxTenuringThreshold=1, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:CMSWaitDuration=10000, -XX:+CMSParallelInitialMarkEnabled, -XX:+CMSEdenChunksRecordAlways, -XX:+CMSClassUnloadingEnabled, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintHeapAtGC, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -XX:+PrintPromotionFailure, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=10, -XX:GCLogFileSize=10M, -Xms3952M, -Xmx3952M, -Xmn600M, -XX:+UseCondCardMark, -XX:CompileCommandFile=/etc/cassandra/hotspot_compiler, -javaagent:/usr/share/cassandra/lib/jamm-0.3.0.jar, -Dcassandra.jmx.local.port=7199, -Dcom.sun.management.jmxremote.authenticate=false, -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password, -Djava.library.path=/usr/share/cassandra/lib/sigar-bin, -Dmx4jaddress=0.0.0.0, -Dmx4jport=7081, -XX:OnOutOfMemoryError=kill -9 %p, -Dlogback.configurationFile=logback.xml, -Dcassandra.logdir=/var/log/cassandra, -Dcassandra.storagedir=/var/lib/cassandra, -Dcassandra-pidfile=/var/run/cassandra/cassandra.pid, -XX:HeapDumpPath=/var/lib/cassandra/java_1589443456.hprof, -XX:ErrorFile=/var/lib/cassandra/hs_err_1589443456.log]

固然,直接在cassandra-env.sh腳本設置這兩個環境變量也是能夠的。

安全

雖然MX4J HttpAdaptor支持用基於戶名和密碼的基礎認證,可是Cassandra沒有使用這個特性,任何人均可以訪問Web控制檯,因此要謹慎決定是否要開啓MX4J HttpAdaptor,以及監控的地址。

配置JMX

默認狀況下,Cassandra開啓了JMX的本地訪問,監聽端口是7199。在Cassandra所在服務器中運行JConsole, 新建鏈接窗口中選擇 遠程進程 ,在地址中填入 127.0.0.1:7199,用戶名和密碼留空,而後就能夠鏈接了:

因爲默認配置下使用的不是SSL鏈接,JConsole會有警告信息,選擇使用不安全鏈接就能夠繼續了:

鏈接成功後,能夠看到虛擬機的運行狀態以及其餘JMX信息:

遠程訪問

開啓遠程訪問首先須要在/etc/default/cassandra腳本中添加如下兩個環境變量:

export LOCAL_JMX=no
  export JVM_OPTS="$JVM_OPTS -Djava.rmi.server.hostname=192.168.112.16"

其中,虛擬機參數java.rmi.server.hostname用來設置JMX服務訪問的域名或者地址。若是不顯試設置,可能會致使遠程訪問失敗。這個地址不必定是服務監聽的地址,好比若是cassandra運行在docker容器中,經過端口映射到宿主機上,那麼就須要設置爲宿主機的地址或者域名。

而後建立文件/etc/cassandra/jmxremote.password,用來設置JMX訪問所需的用戶名和密碼,好比在文件中加入:

jmx 12345

這裏jmx是用戶名,12345是密碼,二者之間用空格分隔。若是有多個用戶,則每一個用戶一行。爲了安全性,建議將這個文件設置爲只有cassandra用戶能夠訪問和修改。

若是配置成功,重啓Cassandra服務能夠在system.log中的jvm參數信息中看到java.rmi.server.hostnamecassandra.jmx.remote.portcom.sun.management.jmxremote.rmi.portcom.sun.management.jmxremote.authenticatecom.sun.management.jmxremote.password.file等的值:

INFO  [main] 2020-05-18 19:11:47,721 CassandraDaemon.java:506 - JVM Arguments: [-Djava.rmi.server.hostname=192.168.112.16, -Xloggc:/var/log/cassandra/gc.log, -ea, -XX:+UseThreadPriorities, -XX:ThreadPriorityPolicy=42, -XX:+HeapDumpOnOutOfMemoryError, -Xss256k, -XX:StringTableSize=1000003, -XX:+AlwaysPreTouch, -XX:-UseBiasedLocking, -XX:+UseTLAB, -XX:+ResizeTLAB, -XX:+UseNUMA, -XX:+PerfDisableSharedMem, -Djava.net.preferIPv4Stack=true, -XX:+UseParNewGC, -XX:+UseConcMarkSweepGC, -XX:+CMSParallelRemarkEnabled, -XX:SurvivorRatio=8, -XX:MaxTenuringThreshold=1, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:CMSWaitDuration=10000, -XX:+CMSParallelInitialMarkEnabled, -XX:+CMSEdenChunksRecordAlways, -XX:+CMSClassUnloadingEnabled, -XX:+PrintGCDetails, -XX:+PrintGCDateStamps, -XX:+PrintHeapAtGC, -XX:+PrintTenuringDistribution, -XX:+PrintGCApplicationStoppedTime, -XX:+PrintPromotionFailure, -XX:+UseGCLogFileRotation, -XX:NumberOfGCLogFiles=10, -XX:GCLogFileSize=10M, -Xms3952M, -Xmx3952M, -Xmn600M, -XX:+UseCondCardMark, -XX:CompileCommandFile=/etc/cassandra/hotspot_compiler, -javaagent:/usr/share/cassandra/lib/jamm-0.3.0.jar, -Dcassandra.jmx.remote.port=7199, -Dcom.sun.management.jmxremote.rmi.port=7199, -Dcom.sun.management.jmxremote.authenticate=true, -Dcom.sun.management.jmxremote.password.file=/etc/cassandra/jmxremote.password, -Djava.library.path=/usr/share/cassandra/lib/sigar-bin, -Dmx4jaddress=0.0.0.0, -Dmx4jport=7081, -XX:OnOutOfMemoryError=kill -9 %p, -Dlogback.configurationFile=logback.xml, -Dcassandra.logdir=/var/log/cassandra, -Dcassandra.storagedir=/var/lib/cassandra, -Dcassandra-pidfile=/var/run/cassandra/cassandra.pid, -XX:HeapDumpPath=/var/lib/cassandra/java_1589800305.hprof, -XX:ErrorFile=/var/lib/cassandra/hs_err_1589800305.log]

接下來就能夠遠程訪問Cassandra的JMX服務了:

除了地址須要改爲遠程地址以後,還須要指定正確的用戶名和密碼。後面的操做就和上文中的例子同樣了。

在上面的日誌信息中,能夠看到還有不少JMX相關的配置項。若是要調整這些配置,則須要修改cassandra-env.sh腳本。好比若是但願修改JMX服務監聽的端口,須要在cassandra-env.sh腳本中找到如下部分,而後將JMX_PORT變量的值修改成指望的端口:

# Specifies the default port over which Cassandra will be available for
  # JMX connections.
  # For security reasons, you should not expose this port to the internet.  Firewall it if needed.
  JMX_PORT="7199"

修改保存後,重啓Cassandra服務,成功的話就能夠看到日誌中的相關信息,並用新端口訪問了。

其它相關的配置能夠參考cassandra-env.sh腳本中的註釋說明和Cassandra文檔。

參考資料

相關文章
相關標籤/搜索